[英]SendMessage c++
我正在编写一个程序,我需要一个功能SendMessage来模拟游戏窗口中的按键,但是我不知道如何使用此功能:
#include <Windows.h>
#include <iostream>
int main()
{
HWND hWnd = FindWindow(NULL,"Game");
HWND edit = FindWindowEx(hWnd, NULL, "Edit", NULL);
SendMessage(edit, WM_CHAR, (TCHAR) 'H', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'L', 0);
SendMessage(edit, WM_CHAR, (TCHAR) 'O', 0);
}
在“游戏”和“编辑”中存在此错误:
Error: l'argomento di tipo "const char *" è incompatibile con il parametro di tipo "LPCWSTR"
因此很明显,您正在将应用程序编译为UNICODE。 考虑到这一点:
"Edit"
不是16位的WIDE字符串,而是8位的NARROW字符串,并且在用UNICODE编译时, CreateWindow
需要一个WIDE字符串。 改用TEXT("Edit")
或L"Edit"
。 与"Game"
相同。
在配置属性->常规og项目属性的“字符集”中具有“使用Unicode字符集”。 这就是为什么几乎所有带有文本转盘的WinAPI函数的名称末尾都带有W的原因。 因此,您可以通过几种方式解决此问题:
它抱怨LPCWSTR
的事实意味着您的项目正在使用Unicode进行编译(在预处理阶段定义了UNICODE
和_UNICODE
)。 这意味着TCHAR
版本的FindWindow(Ex)()
映射到需要LPWSTR
( wchar_t*
)参数的FindWindow(Ex)W()
,而不是映射到需要LPSTR
( char*
)参数的FindWindow(Ex)A()
。
"Game"
和"Edit"
是没有附加任何说明符的字符串文字,因此编译器将它们解释为const char[]
。 char[]
可以降级为char*
,但是不能将其传递给需要wchar_t*
地方。 这就是为什么您得到错误。
因此,您有几种选择:
在项目设置中禁用Unicode,那么您显示的代码将按原样编译。
使用TCHAR
版本的函数时,应使用TEXT()
宏包装文字,以根据是否启用Unicode将它们解释为const wchar_t[]
或const char[]
:
HWND hWnd = FindWindow(NULL, TEXT("Game")); HWND edit = FindWindowEx(hWnd, NULL, TEXT("Edit"), NULL);
完全停止使用FindWindow(Ex)()
的TCHAR
版本。 直接使用FindWindow(Ex)A()
或FindWindow(Ex)W()
代替:
HWND hWnd = FindWindowA(NULL, "Game"); HWND edit = FindWindowExA(hWnd, NULL, "Edit", NULL);
HWND hWnd = FindWindowW(NULL, L"Game"); HWND edit = FindWindowExW(hWnd, NULL, L"Edit", NULL);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.