尝试使用SendMessage和WM_COPYDATA
从C++应用程序到AutoHotkey脚本。我试着遵循在文档中找到的例子:
https://learn.microsoft.com/en-us/windows/win32/dataxchg/using-data-copy
然后我做了:
HWND htarget_window = FindWindow(NULL, L"MyGui");
std::string str = "Hello World";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.lpData = (PVOID) str.c_str();
cds.cbData = strlen((char*)cds.lpData);
auto Response = SendMessage(htarget_window, WM_COPYDATA, (WPARAM)htarget_window, (LPARAM)&cds);
在Autohotkey脚本中:
OnMessage(0x4a , "Receive_WM_COPYDATA")
Receive_WM_COPYDATA(wParam, lParam) {
; Retrieves the CopyDataStruct's lpData member.
StringAddress := NumGet(lParam + 2*A_PtrSize)
; Copy the string out of the structure.
Data := StrGet(StringAddress)
MsgBox Received the following string: %Data%
}
消息正在接收,但这是输出:
当它应该是:Hello World
。
我还在GetLastError()
之后检查了SendMessage
,它输出了0
。
我在COPYDATASTRUCT
里面肯定做错了什么。AutoHotkey x64.
发布于 2021-09-04 04:57:47
使用StrGet()
是错误的:
std::string
的空终止符,但是没有将COPYDATASTRUCT::cbData
字段的值传递给StrGet()
,因此它将寻找一个不存在的空终止符。因此,需要指定COPYDATASTRUCT::cbData
字段中的长度,例如:
StringLen := NumGet(lParam + A_PtrSize,"int");StringAddress := NumGet(lParam + 2*A_PtrSize);Data := StrGet(StringAddress,StringLen,Encoding);Encoding
指定StrGet()
,因此它将以脚本的本机编码方式解释原始数据(参见A_IsUnicode
)。别干那事。明确说明C++代码使用的编码。如果std::string
包含UTF-8字符串,则指定"UTF-8"
。如果std::string
在用户的默认ANSI区域设置中保存一个字符串,则指定"CP0"
。诸若此类。您所看到的通常称为莫吉贝克,当单字节字符数据在错误的编码中被错误解释时,就会发生这种情况。https://stackoverflow.com/questions/69052010
复制相似问题