以下程序用于打印具有焦点的窗口的名称或至少打印程序运行的命令提示符的名称。但它只打印一个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");
}
}
答案 0 :(得分:2)
我敢于猜测TCHAR
扩展为wchar_t
或short
以支持Unicode(UTF-16,更准确),这就是问题的根源。
在UTF16中,字符'W'由2个字节表示:87('W'的ASCII代码)和0。
如果您尝试使用常规printf()
打印以'W'开头的UTF-16字符串,printf()
会将该UTF-16字符串重新解释为“W \ 0”并立即停止打印'W'。
要打印TCHAR
字符串,您应该使用_tprintf()
。
答案 1 :(得分:0)
因为它是TCHAR,所以它可以是ansi或unicode。使用_tprintf代替printf
答案 2 :(得分:0)
如果您想继续使用printf
的ANSI版本,请使用GetWindowTextA
并将TCHAR
替换为char
,因为Windows有2套API可用于字符串:< / p>
1)版本(A)使用ANSI字符串并以char*
或const char*
作为输入。
2)版本(W)使用宽字符串并以wchar_t*
或const wchar_t*
作为输入。由于这是函数的本机版本,因此它稍微快一些,并且可以使用Unicode字符串。
由于您的项目中定义了_UNICODE
,TCHAR
将映射到wchar_t
而GetWindowText
将映射到GetWindowTextW
,因此您使用printf
{1}}使用窄字符串无法使用“wchar_t*
打印%s
,您应该使用_tprintf
或停止使用TCHAR
并直接调用API版本最符合您的需求(此处致电GetWindowTextA
),例如您可以使用:
wchar_t title[500];
GetWindowTextW(GetForegroundWindow(), title, 500);
printf("%ls\n", title);