2013-04-30 90 views
0

我有一个需要与另一个应用程序接口的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

看来,我需要经历的过程是:

  1. 抓住过程并打开所有的访问。 User32.GetWindowThreadProcessId(windowHandle,out pId);

    //打开所有访问过程
    someprocess = OpenProcess((0x1F0FFF),false,(int)pId);

  2. 在这个过程中分配一个缓冲器: IntPtr的缓冲液= VirtualAllocEx来(hProcess,IntPtr.Zero,1024,0x1000的,0×04);

  3. 填写某种结构将被写入在#2中创建的缓冲区?

  4. 复制#3到远程缓冲区是#2? WriteProcessMemory的?

  5. 发送自定义消息(SendMessage消息(windowhandle,customMsg,0,从#2缓冲器?)

  6. 从远程进程缓冲器回读结构到本地缓冲器

  7. 元帅此数据托管的类型。(这是一个C#.NET应用程序)

我真的可以使用一些见解。我没有多少运气迄今。我认为我最憋屈的部分是什么类型的结构发送到WriteProcessMemory?

+3

你可以使用'WM_COPYDATA',让它做数据编组为您服务。 – jamesdlin 2013-04-30 19:35:04

+0

如果你正在做的事情已经完成了数十亿次(两个进程进行通信),并且你发现自己使用了调试功能(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

+0

我知道让两个进程进行通信,但我的理解是,在处理CUSTOM消息时必须对数据编组进行自定义,我错了吗? 这些都是WM_USER + X消息。 – tronious 2013-04-30 20:17:58

回答

1

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函数返回访问数据时,必须将数据复制到本地缓存

+0

有关wm_copydata的问题...我无法访问目标代码。这是第三个他们不需要在它们的末端有一些处理程序来处理传入的wm_copydata消息吗?我可以向目标请求零更改 – tronious 2013-04-30 23:29:44

+0

正如@tronious所说,其他代码不能被修改,再加上WM_COPYDATA没有特别之处,这是一个方便,但它只是这个问题询问,只是没有更多的编组。 – user34660 2017-01-15 00:32:40

+0

@ user34660老兄,那是4年前 – 2017-01-15 06:30:18