我试图使用 GetForegroundWindow 和 GetWindowText 函数获取活动窗口标题,这是我的代码
HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);
每次我尝试构建项目时,我都会收到此错误消息“错误:错误:无法将 char 转换为 wchat_t *”
我正在使用 c++builder xe7
那么,怎么了?
我试图使用 GetForegroundWindow 和 GetWindowText 函数获取活动窗口标题,这是我的代码
HWND hwnd = GetForegroundWindow();
char wname[255];
GetWindowText(hwnd,wname,255);
每次我尝试构建项目时,我都会收到此错误消息“错误:错误:无法将 char 转换为 wchat_t *”
我正在使用 c++builder xe7
那么,怎么了?
您正在TCHAR
调用GetWindowText()
. 在您的项目选项中,您将“TCHAR 映射到”选项设置为wchar_t
,因此GetWindowText()
映射到GetWindowTextW()
,它带有一个wchar_t*
参数。这就是为什么您不能传入char[]
缓冲区的原因。
因此,您需要:
将“TCHAR 映射到”更改char
为改为GetWindowText()
映射到GetWindowTextA()
(同样会影响代码中所有其他TCHAR
基于 API 的函数调用。仅在将旧的 Unicode 前代码迁移到 C++Builder 2009+ 时使用此方法)。
更改您的代码以使用TCHAR
:
TCHAR wname[255];
GetWindowText(hwnd,wname,255);
更改您的代码以GetWindowText()
直接使用 Ansi 或 Unicode 版本:
char wname[255];
GetWindowTextA(hwnd,wname,255);
wchar_t wname[255];
GetWindowTextW(hwnd,wname,255);
您正在以 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 的应用程序(您应该这样做),您还必须记住使用wmain
or _tmain
(如果适用),而不是简单的陈旧无聊main
的 . 因为视窗。