【发布时间】:2013-04-24 19:30:32
【问题描述】:
我有一个需要与另一个应用程序交互的 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, 0x04);
填充某种结构,将写入 #2 中创建的缓冲区?
将#3 复制到远程缓冲区是#2? WriteProcessMemory??
发送自定义消息(SendMessage(windowhandle, customMsg, 0, buffer from #2?)
将结构从远程进程缓冲区读回本地缓冲区
将此数据编组为托管类型。 (这是一个 C# .Net 应用程序)
我真的可以使用一些洞察力。到目前为止,我还没有多少运气。我认为我最坚持的部分是发送到 WriteProcessMemory 的结构类型是什么?
【问题讨论】:
-
你可以使用
WM_COPYDATA,让它为你做数据封送处理。 -
如果您正在做的事情之前已经完成了无数次(两个进程正在通信)并且您发现自己正在使用调试功能(OpenProcess、WriteProcessMemory 等),那么这是一个非常明显的迹象,表明您'做错了。 Windows has many ways of doing Interprocess Communication.
-
我理解让两个进程进行通信,但我理解在处理 CUSTOM 消息时必须自定义数据编组是错误的吗?这些都是 WM_USER+X 消息。
-
您是对的,您不能使用 WM_USER 消息发送自定义数据。所以你需要使用一些其他的机制来发送数据。现在您正在使用其他机制发送数据,您需要自定义消息做什么?自定义消息是一个糟糕的选择。由于您已经在使用消息,
WM_COPYDATA将是一个不错的选择,正如其他人所指出的那样。 -
感谢您的回复。虽然现在正在使用 ReadProcessMemory 和 WriteProcessMemory。我将研究 wm_copydata。但是,我担心我仍然需要能够写入和写入数据。自定义消息传递也不是我的选择。无论好坏,我都坚持下去。需要让它工作,因为它是我可用于集成的。感谢您的回复。在我调查 wm_copydata 后将选择一个答案
标签: c# .net winapi marshalling sendmessage