You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:27:02