发送自定义窗口消息...自定义数据编组
我有一个需要与另一个应用程序接口的WPF应用程序。发送自定义窗口消息...自定义数据编组
此应用程序有大约20个自定义Windows消息(WM_USER + 50 ... WM_USER + 70)。
总结一下我试图做到:
WPF应用程序 - > SendMessage函数 - >第三方应用
我的问题是,所有的消息都是自定义消息。因此我必须实现自己的数据封送。
见http://msdn.microsoft.com/en-us/library/windows/desktop/ms644950(v=vs.85).aspx
看来,我需要经历的过程是:
-
抓住过程并打开所有的访问。 User32.GetWindowThreadProcessId(windowHandle,out pId);
//打开所有访问过程
someprocess = OpenProcess((0x1F0FFF),false,(int)pId); 在这个过程中分配一个缓冲器: IntPtr的缓冲液= VirtualAllocEx来(hProcess,IntPtr.Zero,1024,0x1000的,0×04);
填写某种结构将被写入在#2中创建的缓冲区?
复制#3到远程缓冲区是#2? WriteProcessMemory的?
发送自定义消息(SendMessage消息(windowhandle,customMsg,0,从#2缓冲器?)
从远程进程缓冲器回读结构到本地缓冲器
元帅此数据托管的类型。(这是一个C#.NET应用程序)
我真的可以使用一些见解。我没有多少运气迄今。我认为我最憋屈的部分是什么类型的结构发送到WriteProcessMemory?
WM_COPYDATA
绝对是最简单的方法。使用WM_COPYDATA
可以将两个不同的数据项发送给另一个进程 - 一个DWORD值和一个任意大小的数据块。因此,对于你实现你可能会做这样的事情:
COPYDATASTRUCT cds;
cds.dwData = WM_USER + 50; // the "message" you want to send
cds.cbData = sizeof(MyDataForMessage50); // the size of the chunk of data
cds.lpData = lpMessage50Data; // a pointer to the chunk of data
SendMessage(hwndTarget, WM_COPYDATA, reinterpret_cast<WPARAM>(hwndSender),
reinterpret_cast<LPARAM>(&cds));
注意hwndTarget
是在其他进程中的目标窗口,并hwndSender
是在窗口发送过程。目标窗口收到相同的参数,因此可以使用wParam
来了解发送消息的人员,因此可以根据需要发送回复。
在WndProc中,在接收端:
if (uMsg == WM_COPYDATA)
{
HWND hwndSender = reinterpret_cast<HWND>(wParam);
LPCOPYDATASTRUCT pcds = reinterpret_cast<LPCOPYDATASTRUCT>(lParam);
DWORD dwCustomMsg = pcds->dwData;
LPVOID pCustomData = pcds->lpData;
DWORD dwCustomDataSize = pcds->cbData;
// do something with the custom message
// return TRUE to indicate message received
return TRUE;
}
还要注意在文档的重要注意事项WM_COPYDATA
:
接收应用程序应该考虑只读数据。 lParam参数仅在处理消息时有效。 接收应用程序不应释放lParam引用的内存。如果接收应用程序必须经过 SendMessage函数返回访问数据时,必须将数据复制到本地缓存
你可以使用'WM_COPYDATA',让它做数据编组为您服务。 – jamesdlin 2013-04-30 19:35:04
如果你正在做的事情已经完成了数十亿次(两个进程进行通信),并且你发现自己使用了调试功能(OpenProcess,WriteProcessMemory等),那么这是一个非常明显的迹象,表明你做错了。 [Windows有多种进行进程间通信的方式](http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx)。 – arx 2013-04-30 20:07:12
我知道让两个进程进行通信,但我的理解是,在处理CUSTOM消息时必须对数据编组进行自定义,我错了吗? 这些都是WM_USER + X消息。 – tronious 2013-04-30 20:17:58