PostThreadMessage 到另一个进程
Posted
技术标签:
【中文标题】PostThreadMessage 到另一个进程【英文标题】:PostThreadMessage to another process 【发布时间】:2010-06-21 10:38:08 【问题描述】:我想向作为另一个进程(特别是作为 Windows 服务)运行的线程发布消息。我已经阅读了PostThreadMessage 的文档,但有些事情我不清楚。
如何获得服务线程的句柄?
系统仅对系统消息(0 到 (WM_USER-1) 范围内的消息)进行编组。要将其他消息(那些 >= WM_USER)发送到另一个进程,您必须进行自定义编组。
我想发送自己的消息,那么我该如何进行编组?
【问题讨论】:
【参考方案1】:PostThreadMessage 在这里不太理想。获取线程 ID 确实是一个问题,因为您的服务必须运行多个线程。一个用于实现服务,另一个用于泵送读取消息所需的消息循环。 CreateToolHelp32Snapshot() 可以枚举线程,但您仍然不知道这两个线程中的哪一个是正在抽水的线程。
改用命名管道。在您的服务中调用 CreateNamedPipe(),使用消息模式并为管道命名以“Global\”为前缀,以便在用户会话中可见。用户代码可以使用众所周知的管道名称连接到管道。您可以通过管道发送您想要的任何内容,但您必须避免使用指针,因为它们在服务过程中无效。与消息编组相同的问题。
其他可能性是套接字,非常类似于管道,但使用众所周知的端口号而不是名称,以及进程外 COM。如果您有需要跨进程边界编组的复杂对象,则使用 COM 是一个优势。如果您没有 COM Skillz,请避免使用它。
【讨论】:
我要做的是找到让我的服务和应用程序进行通信的最佳方式,并使这种通信对任何第 3 方来说最不可见。我不想走COM方式。命名管道看起来很有趣。以上是关于PostThreadMessage 到另一个进程的主要内容,如果未能解决你的问题,请参考以下文章
WPF 应用程序消息循环和 PostThreadMessage