我在VC ++中编写了一个服务。我跟着tutorial here。现在,我试图找出如何接收DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE,WM_COPYDATA等消息,就像具有顶级窗口的常规应用程序一样。在搜索时,我遇到了this MSDN article
在“广播信息”部分的最后几段中:
应用程序通过其窗口过程接收消息 顶级窗户。消息不会发送到子窗口。 服务 可以通过窗口过程或其服务接收消息 控制处理程序。
但几乎不可能找到任何如何做的例子。
如何将WndProc与我的服务相关联以便收到消息?
或者,如何使我的服务控制处理函数接收Windows消息?我的服务控制处理程序只有一个DWORD参数,而不是WndProc的UINT,WPARAM,LPARAM等。
我已经阅读过1)使用隐藏窗口和2)仅消息窗口等,但我不认为我可以在服务中使用它们;不想。如果我能用MSDN提到的两种方式中的任何一种方式完成它,我会很高兴。
服务说明:
该服务将检测USB设备插入并将一些文件复制到其中。它还必须跟踪某些目录和文件的更改,以便它知道要复制哪些目录和文件。
此基本功能可能会在未来扩展到包含其他内容。所以,我可能必须能够收到许多其他我现在都不知道的Windows消息。
在开发常规Windows应用程序时,上面提到的示例消息简单地取自我习惯的内容。在编写服务时,我了解它们是否适合或不安全。
答案 0 :(得分:3)
嗯,你只需创建一个普通的消息循环,就像你编写一个Win32窗口化应用程序的纯C实现一样 - 不涉及任何框架。
示例:
while(GetMessage(...)) ...
您可以使用PeekMessage
或GetMessage
(请参阅链接的文档)。但后者更传统,并将其从消息队列中删除。
即。你甚至不需要窗户。每个线程都可以有一个消息循环。所以它会阻塞,但只有当前的线程。你必须弄清楚如何将信息传递给需要它的其他线程。
但是,不要冒险让MS为你做出让你不要射击自己下半身的东西,你应该read about Shatter Attacks over on Wikipedia并使用适当的IPC技术进行服务(有很多可用的,从MMF到管道,再到信号量,互斥和事件的组合。
如果您打算在用户桌面上接收窗口消息但具有您的特权上下文(无论如何都应该阻止会话分离),此部分是相关的。
答案 1 :(得分:1)
使用RegisterServiceCtrlHandlerEx函数和HandlerEx回调函数。
是的,正如 0xC0000022L 指出的那样,最好使用IPC技术,例如命名管道 - 我最喜欢的。 :)