gpt4 book ai didi

c++ - 如何将 WM_COPYDATA 从 C++ 发送到 AutoHotKey?

转载 作者:行者123 更新时间:2023-12-05 04:45:46 25 4
gpt4 key购买 nike

尝试使用 WM_COPYDATA 从 C++ 应用程序SendMessage 到 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%

}

正在接收消息,但这是输出:

image

当它应该是:Hello World

我还在 SendMessage 之后检查了 GetLastError(),它输出 0

我一定是在 COPYDATASTRUCT 中做错了什么。AutoHotkey x64。

最佳答案

您对 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);
  • 更重要的是,您没有为 StrGet() 指定 Encoding,因此它将以任何原始编码解释原始数据脚本是(参见 A_IsUnicode)。不要那样做。明确 C++ 代码使用的编码。如果 std::string 包含 UTF-8 字符串,请指定 "UTF-8"。如果 std::string 包含用户默认 ANSI 语言环境中的字符串,请指定 "CP0"。等等。您所看到的情况通常称为 Mojibake ,当单字节字符数据在错误的编码中被错误解释时会发生这种情况。

关于c++ - 如何将 WM_COPYDATA 从 C++ 发送到 AutoHotKey?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69052010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com