接收服务中的Windows消息

时间:2013-02-28 17:10:08

标签: winapi visual-c++ service windows-messages

我在VC ++中编写了一个服务。我跟着tutorial here。现在,我试图找出如何接收DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE,WM_COPYDATA等消息,就像具有顶级窗口的常规应用程序一样。在搜索时,我遇到了this MSDN article

在“广播信息”部分的最后几段中:

  

应用程序通过其窗口过程接收消息   顶级窗户。消息不会发送到子窗口。 服务   可以通过窗口过程或其服务接收消息   控制处理程序。

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

  1. 如何将WndProc与我的服务相关联以便收到消息?

  2. 或者,如何使我的服务控制处理函数接收Windows消息?我的服务控制处理程序只有一个DWORD参数,而不是WndProc的UINT,WPARAM,LPARAM等。

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

    服务说明:

    该服务将检测USB设备插入并将一些文件复制到其中。它还必须跟踪某些目录和文件的更改,以便它知道要复制哪些目录和文件。

    此基本功能可能会在未来扩展到包含其他内容。所以,我可能必须能够收到许多其他我现在都不知道的Windows消息。

    在开发常规Windows应用程序时,上面提到的示例消息简单地取自我习惯的内容。在编写服务时,我了解它们是否适合或不安全。

2 个答案:

答案 0 :(得分:3)

嗯,你只需创建一个普通的消息循环,就像你编写一个Win32窗口化应用程序的纯C实现一样 - 不涉及任何框架。

示例:

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

您可以使用PeekMessageGetMessage(请参阅链接的文档)。但后者更传统,并将其从消息队列中删除。

即。你甚至不需要窗户。每个线程都可以有一个消息循环。所以它会阻塞,但只有当前的线程。你必须弄清楚如何将信息传递给需要它的其他线程。

然而

但是,不要冒险让MS为你做出让你不要射击自己下半身的东西,你应该read about Shatter Attacks over on Wikipedia并使用适当的IPC技术进行服务(有很多可用的,从MMF到管道,再到信号量,互斥和事件的组合。

如果您打算在用户桌面上接收窗口消息但具有您的特权上下文(无论如何都应该阻止会话分离),此部分是相关的。

答案 1 :(得分:1)

使用RegisterServiceCtrlHandlerEx函数和HandlerEx回调函数。

是的,正如 0xC0000022L 指出的那样,最好使用IPC技术,例如命名管道 - 我最喜欢的。 :)