0

したがって、GetWindowTextはMSDNで次のように宣言されています。

int GetWindowText(      
    HWND hWnd,
    LPTSTR lpString,
    int nMaxCount
);

ただし、コードが機能するには、2番目のパラメーターを次のように宣言する必要があります。

TCHAR[255] WTitle;

次に、関数を呼び出しますGetWindowText(hWnd,Wtitle,255); 。LPTSTRはtcharの配列へのポインターであるため、LPTSTRの宣言はTCHAR []の宣言に似ていますか?ただし、このようには機能しません。TCHAR []を使用すると、プログラムは有効なGetWindowText結果を返します(これは、タイトルのシンボルの数に等しい整数です)。問題は、TCHAR []から正確なタイトルを取得するにはどうすればよいですか?次のようなコード

TCHAR[255] WTitle;
cout<< WTitle;

また

cout<< *Wtitle;

数値を返します。これを特定の文字列と比較するにはどうすればよいですか?

TCHAR[4] Test= __T("TEST")
if (WTitle == Test) do smth

も動作しません。

4

5 に答える 5

3

うわー、どこから始めるか見てみましょう。

まず、WTitle の宣言は次のようにする必要があります。

TCHAR WTitle[255];

次に、cout が書き込みを行っていない場合は、Unicode モードを使用しているため、次のようにする必要があります。

wcout << WTitle;

または、tchar フレームワーク全体によりよく適合させるために、これを追加できます (実際、これがまだ tchar.h の一部ではないことに驚いています)。

#ifdef _UNICODE
    #define tcout wcout
#else
    #define tcout cout
#endif

そして、次を使用します。

tcout << WTitle;
于 2010-02-09T19:16:35.027 に答える
2

簡単な答え: Win98 用にコーディングしている場合を除き、wchar_t代わりにTCHARandwcoutの代わりに使用してくださいcout

長いバージョン:

このTCHAR型は、コードを複数の文字列モードでコンパイルできるようにするために存在します。たとえば、ASCII と Unicode をサポートします。型はTCHAR、設定に基づいて適切な文字型に条件付きでコンパイルされます。

すべての新しい Win システムは Unicode ベースです。ASCII 文字列が OS 関数に渡されると、Unicode に変換され、実際の関数が呼び出されます。したがって、アプリケーション全体で Unicode を使用するのが最善です。

于 2010-02-09T19:13:26.090 に答える
2

OK、最初にいくつかの定義。

'T' 型は、ビルド設定で _UNICODE シンボルが定義されているかどうかに応じて、CHAR (1 バイト) または WCHAR (2 バイト) のいずれかに評価される定義です。その意図は、1 つのソース コード セットで ANSI と UNICODE の両方をターゲットにできるようにすることです。

定義:

TCHAR title[100];
TCHAR * pszTitle;

...同等ではありません。1 つ目は、100 個の TCHAR のバッファーを定義します。2 番目は、1 つまたは複数の TCHAR へのポインターを定義しますが、バッファーを指していません。さらに遠く、

sizeof(title) == 100   (or 200, if _UNICODE symbol is defined)
sizeof(pszTitle) == 4  (size of a pointer in Win32)

次のような関数がある場合:

void foo(LPCTSTR str);

...上記の 2 つの変数のいずれかを次の場所に渡すことができます。

foo(title);    // passes in the address of title[0]
foo(pszTitle); // passes in a copy of the pointer value

数字を取得している理由は、おそらく UNICODE が定義されてて (文字が広いため)、1 バイト文字に固有の cout を使用しているためです。代わりにwcoutを使用します。

wcout << title;

最後に、これらは機能しません:

TCHAR[4] Test == __T("TEST")   ("==" is equality comparison, not assignment)
if (WTitle == Test) do smth    (you're comparing pointers, use wcscmp or similar)
于 2010-02-09T19:21:42.470 に答える
1

_tcscmp またはバリアント (比較する文字数を取る) を使用します。http://msdn.microsoft.com/en-us/library/e0z9k731.aspx

お気に入り:

if (_tcscmp(WTitle, Test) == 0) {
    // They are equal! Do something.
}
于 2010-02-09T19:14:11.673 に答える
1

C では、wchar_t は整数型 (通常は short int) の typedef です。C++ では、独自の別の型である必要がありますが、Microsoft のコンパイラはデフォルトで typedef を使用します。独自の別の型にするには、/Zc:wchar_tコンパイラ スイッチを使用する必要があります。ただし、それで問題が完全に解決するかどうかはわかりません。ライブラリにネイティブ型として wchar_t の実際のオーバーロードがあり、短い int ではなく文字として出力されるかどうかはわかりません。

ただし、一般的に言えば、とにかく Microsoft の "T" バリアントをいじらないことをお勧めします。それらを正しく設定するのは面倒であり、主に 16 ビット Windows との互換性を提供することを目的としていました。その行の最後のリリースから約 10 年が経過したことを考えると、少なくとも数人の顧客が実際に使用していることを本当に確信していない限り、新しいコードではおそらく無視しても問題ありません。

于 2010-02-09T19:16:07.897 に答える