0

以下程序旨在打印具有焦点的窗口的名称或至少打印程序正在运行的命令提示符的名称。但它只打印一个字符,即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

我敢猜测它TCHAR会扩展到wchar_tshort支持 Unicode(更准确地说是 UTF-16),这就是问题的根源。

在 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。使用 _tprintf 代替 printf

于 2012-10-13T14:12:21.007 回答
0

如果您想继续使用 ANSI 版本,请printf使用GetWindowTextA并替换TCHAR为,char因为 Windows 有 2 组适用于字符串的 API:

1) 使用 ANSI 字符串并将char*orconst char*作为输入的版本 (A)。

2) 使用宽字符串并以wchar_t*orconst wchar_t*作为输入的版本 (W)。由于这是该函数的本机版本,因此速度稍快,并且可以处理 Unicode 字符串。

由于_UNICODE在您的项目中定义,TCHAR将被映射到wchar_t并将GetWindowText被映射到GetWindowTextW,因此您使用printf窄字符串无法wchar_t*使用 '打印%s,您应该使用_tprintf或停止使用TCHAR并直接调用最匹配您的 API 版本需要(这里调用GetWindowTextA)例如你可以使用这个:

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