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

标签 c++ winapi autohotkey

尝试使用 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/

相关文章:

autohotkey - 如何将变量传递给 WinExist?

c++ - 将多维数组复制到 vector ,反之亦然

c++ - 错误 C2664 : in c++?

autohotkey - AHK - 相对于应用程序窗口的鼠标点击坐标

c++ - WinAPI混淆函数参数

c - 如何用C和MinGW连接两个字符串?

python - 如何从 AHK 脚本内部调用 python 函数?

c++ - 有没有一种方便的方法可以将 std::pair 包装为新类型?

c++ - 如何避免为未使用的属性分配内存

c++ - 在 Windows 中,如何检测 Unicode 字符是否呈现为正方形( bean 腐)?