0

我试图使用 GetForegroundWindow 和 GetWindowText 函数获取活动窗口标题,这是我的代码

HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);

每次我尝试构建项目时,我都会收到此错误消息“错误:错误:无法将 char 转换为 wchat_t *”

我正在使用 c++builder xe7

那么,怎么了?

4

2 回答 2

3

您正在TCHAR调用GetWindowText(). 在您的项目选项中,您将“TCHAR 映射到”选项设置为wchar_t,因此GetWindowText()映射到GetWindowTextW(),它带有一个wchar_t*参数。这就是为什么您不能传入char[]缓冲区的原因。

因此,您需要:

  1. 将“TCHAR 映射到”更改char为改为GetWindowText()映射到GetWindowTextA()(同样会影响代码中所有其他TCHAR基于 API 的函数调用。仅在将旧的 Unicode 前代码迁移到 C++Builder 2009+ 时使用此方法)。

  2. 更改您的代码以使用TCHAR

    TCHAR wname[255];
    GetWindowText(hwnd,wname,255);
    
  3. 更改您的代码以GetWindowText()直接使用 Ansi 或 Unicode 版本:

    char wname[255];
    GetWindowTextA(hwnd,wname,255);
    

    wchar_t wname[255];
    GetWindowTextW(hwnd,wname,255);
    
于 2015-07-12T17:39:01.793 回答
0

您正在以 Unicode 感知模式构建应用程序;achar不够大,无法容纳 UTF-16 字符。类型系统通过为您捕捉到这个,可以让您免于很多潜在的头痛。要么更改为 ASCII 模式(简单但不好的解决方案),切换到在任何地方使用宽字符串(烦人的解决方案),要么使用提供的宏在编译时根据构建参数进行选择(更烦人但最正确的解决方案)。

这是实现上述任一解决方案后此代码段的外观:

HWND hwnd = GetForegroundWindow();
wchar_t wname[255];
GetWindowText(hwnd, wname, 255);

HWND hwnd = GetForegroundWindow();
TCHAR wname[255];
GetWindowTextW(hwnd, wname, 255);

如果您选择构建一个支持 Unicode 的应用程序(您应该这样做),您还必须记住使用wmainor _tmain(如果适用),而不是简单的陈旧无聊main的 . 因为视窗。

于 2015-07-12T04:00:16.397 回答