收到Windows消息的服务(Receive Windows Messages in a Servi

2019-07-20 17:44发布

我已经写在VC ++的服务。 我跟着这里的教程 。 现在,我试图找出如何接收消息像DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE,WM_COPYDATA等,就像是有一个顶层窗口一个普通的应用程序。 当它搜索,我碰上了这MSDN文章

在“广播消息”一节,在最后的段落:

应用程序通过自己的顶层窗口的窗口过程接收消息。 消息不发送到子窗口。 服务可通过窗口过程或者他们的服务控制处理程序接收消息。

但是这几乎是不可能找到如何做到这一点的任何例子。

  1. 一个的WndProc我服务,所以其收到的消息我怎么能联系起来?

  2. 或者说,我怎样才能让我的服务控制处理函数接收窗口消息? 我的服务控制处理程序只有一个DWORD参数而不是UINT,WPARAM,LPARAM一个的WndProc的等。

我看过1)使用隐藏的窗口和2)消息仅窗口等,但我不认为我可以在服务中使用它们; 不想。 它会很高兴,如果我能在任的这MSDN提到这两个方式完成它。

服务描述:

该服务将检测到USB设备插入和一些文件复制到其中。 它也有保留更改某些目录和文件的轨道,以便它知道哪些复制。

这一基本功能可以扩展到包括其他的东西,在未来。 所以,我可能要能够接收这我不知道现在很多其他窗口的消息。

上面提到的例子消息只是从我习惯了拍摄,制定常规的Windows应用程序时。 我明白,如果它们不适合或者安全,编写服务时。

Answer 1:

嗯,你只需创建一个普通的消息循环,你会如果你写一个纯粹的C实现一个Win32窗口程序的 - 没有任何涉及框架。

例:

while(GetMessage(...)) ...

您可以使用PeekMessageGetMessage (见链接的文档)。 但后者是更常规的,并从消息队列中移除。

例如,你甚至不需要一个窗口。 每个线程可以有消息循环。 因此,这将是阻止,但只有当前线程。 你得弄清楚你自己如何传达要求它的信息给其他线程。

但是

但不是在妥协的东西,MS拿出来你不要搬起石头砸自己的下半身关闭工作,你应该了解在维基百科上过粉碎攻击和使用合适的IPC技术的服务(有很多选择,从MMF到管道与信号量,互斥和事件)的组合。

如果你打算在用户的桌面上,但与你的特权上下文(会话的分离度应防止反正)接收窗口的消息,该部分是相关的。



Answer 2:

使用RegisterServiceCtrlHandlerEx与功能HandlerEx回调函数。

是的,正如指出的0xC0000022L被更好地利用IPC技术,例如命名管道-我的最爱。 :)



文章来源: Receive Windows Messages in a Service