0

次のプログラムは、フォーカスのあるウィンドウの名前、または少なくともプログラムが実行されているコマンドプロンプトの名前を出力することを目的としていますが、。である1文字のみを出力しますW。なんでそうなの?どこを間違えているの?

#include <Windows.h>
#include <stdio.h>

int main() {
 TCHAR title[500];
 int i=0;
 while(i<10) {
   GetWindowText(GetForegroundWindow(), title, 500);
   printf("%s\n",title);
   i++;
   system("pause");
 }
}
4

3 に答える 3

2

それがUnicode(より正確には、UTF-16)にTCHAR拡張されるwchar_tか、それをサポートすることをあえて推測します。これが問題の原因です。short

UTF16では、文字「W」は2バイトで表されます。87(「W」のASCIIコード)と0です。

「W」で始まるUTF-16文字列を通常ので印刷しようとすると、printf()そのprintf()UTF-16文字列を「W \ 0」として再解釈し、「W」の直後に印刷を停止します。

文字列を印刷するには、代わりにTCHARを使用する必要があります_tprintf()

于 2012-10-13T14:06:12.747 に答える
0

これは TCHAR であるため、ANSI または Unicode にすることができます。printf の代わりに _tprintf を使用する

于 2012-10-13T14:12:21.007 に答える
0

ANSI バージョンを で引き続き使用する場合は、Windows には文字列を操作する 2 つの API セットがあるためprintf、 を使用しGetWindowTextAて に置き換えます。TCHARchar

1) ANSI 文字列で動作し、char*orconst char*を入力として受け取るバージョン (A)。

wchar_t*2) 幅の広い文字列で動作し、 orconst wchar_t*を入力として使用するバージョン (W) 。これは関数のネイティブ バージョンであるため、わずかに高速であり、Unicode 文字列を処理することもできます。

_UNICODEはプロジェクトで定義されているため、 にTCHARマップされwchar_tGetWindowTextにマップされるGetWindowTextWため、狭い文字列で作業していたユーザーは'でprintf印刷できません。使用するか、使用を停止して、最も一致するバージョンの API を直接呼び出す必要があります。必要 (ここでは call ) たとえば、これを使用できます。wchar_t*%s_tprintfTCHARGetWindowTextA

wchar_t title[500];
GetWindowTextW(GetForegroundWindow(), title, 500);
printf("%ls\n", title);
于 2012-10-13T15:14:53.150 に答える