【问题标题】:Name of the window doesn't get printed未打印窗口名称
【发布时间】:2012-10-13 13:59:21
【问题描述】:

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

【问题讨论】:

  • 已经停止 TCHARing 并使用 wchar_t。现在是 2012 年。

标签: c++ c windows winapi


【解决方案1】:

我敢猜测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()

【讨论】:

  • title经过GetWindowText后是一个UTF-16编码的字符串?
  • 为什么不呢?请参阅GetWindowText() 描述:LPTSTR lpString。你能在里面看到一个“T”吗?
【解决方案2】:

因为它是一个 TCHAR,它可以是 ansi 或 unicode。使用 _tprintf 代替 printf

【讨论】:

    【解决方案3】:

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

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

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

    由于在您的项目中定义了_UNICODETCHAR 将被映射到wchar_t 并且GetWindowText 将被映射到GetWindowTextW,因此您使用printf 处理窄字符串不能print wchar_t* with '%s, 你应该使用_tprintf 或停止使用TCHAR 并直接调用最符合你需要的API版本(这里调用GetWindowTextA)例如你可以使用这个:

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

    【讨论】:

      猜你喜欢
      • 2020-01-13
      • 2018-04-10
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多