如何从C++向AutoHotKey发送WM_COPYDATA消息?
问题根因
- 编码不匹配:你C++侧发送的是窄字符(
std::string默认是ANSI/UTF-8编码),而64位AutoHotkey默认使用UTF-16 LE编码解析字符串,StrGet不指定编码时会按默认的UTF-16读取字节,自然会出现乱码。 - 长度配置缺失:你当前AHK侧没有读取
COPYDATASTRUCT的cbData字段,也没有指定字符串长度,解析时容易出现溢出或读取错位。
方案1:C++侧改发宽字符(最推荐,适配AHK默认逻辑)
修改C++代码,改用宽字符串发送,编码和AHK默认完全一致,无需改动AHK侧代码:
HWND htarget_window = FindWindow(NULL, L"MyGui"); // 改用宽字符串 std::wstring str = L"Hello World"; COPYDATASTRUCT cds; cds.dwData = 1; cds.lpData = (PVOID) str.c_str(); // 计算字节数:字符串长度+1(带终止符)乘以每个宽字符的字节数 cds.cbData = (str.length() + 1) * sizeof(wchar_t); auto Response = SendMessage(htarget_window, WM_COPYDATA, (WPARAM)htarget_window, (LPARAM)&cds);
方案2:AHK侧指定编码解析(适合C++侧无法修改的场景)
如果C侧必须发送窄字符,先把C的cds.cbData改为str.size() + 1,带上字符串终止符提升容错性,再修改AHK接收逻辑,指定编码解析:
OnMessage(0x4a, "Receive_WM_COPYDATA") Receive_WM_COPYDATA(wParam, lParam) { ; 先读取cbData(字符串字节长度) cbData := NumGet(lParam + A_PtrSize, 0, "UInt") ; 读取lpData地址 StringAddress := NumGet(lParam + 2*A_PtrSize) ; 按实际编码解析,UTF-8填"UTF-8",ANSI填"CP0" Data := StrGet(StringAddress, cbData, "UTF-8") MsgBox Received the following string: %Data% }
内容的提问来源于stack exchange,提问作者user14766639
相关产品推荐
相关产品推荐

