窗口名称无法打印

时间:2012-10-13 13:59:21

标签: c++ c windows winapi

以下程序用于打印具有焦点的窗口的名称或至少打印程序运行的命令提示符的名称。但它只打印一个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");
 }
}

3 个答案:

答案 0 :(得分:2)

我敢于猜测TCHAR扩展为wchar_tshort以支持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字符串。

由于您的项目中定义了_UNICODETCHAR将映射到wchar_tGetWindowText将映射到GetWindowTextW,因此您使用printf {1}}使用窄字符串无法使用“wchar_t*打印%s,您应该使用_tprintf或停止使用TCHAR并直接调用API版本最符合您的需求(此处致电GetWindowTextA),例如您可以使用:

wchar_t title[500];
GetWindowTextW(GetForegroundWindow(), title, 500);
printf("%ls\n", title);