首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将WM_COPYDATA从C++发送到AutoHotKey?

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

Stack Overflow用户
提问于 2021-09-04 02:32:10
回答 1查看 236关注 0票数 3

尝试使用SendMessageWM_COPYDATA从C++应用程序到AutoHotkey脚本。我试着遵循在文档中找到的例子:

https://learn.microsoft.com/en-us/windows/win32/dataxchg/using-data-copy

然后我做了:

代码语言:javascript
运行
复制
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脚本中:

代码语言:javascript
运行
复制
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.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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"。诸若此类。您所看到的通常称为莫吉贝克,当单字节字符数据在错误的编码中被错误解释时,就会发生这种情况。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69052010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档