Winapi 在服务中接收Windows消息

Winapi 在服务中接收Windows消息,winapi,visual-c++,service,windows-messages,Winapi,Visual C++,Service,Windows Messages,我已经用VC++写了一个服务。我跟着火车走。现在,我试图了解如何接收诸如DBT_DEVICEARRIVAL、DBT_DeviceMoveComplete、WM_COPYDATA等消息,就像具有顶级窗口的常规应用程序一样。在寻找它的时候,我偶然发现了它 在“广播信息”部分的最后几段: 应用程序通过其应用程序的窗口过程接收消息 顶层窗口。消息不会发送到子窗口服务 可以通过窗口过程或其服务接收消息 控制处理程序。 但几乎不可能找到任何这样做的例子 如何将WndProc与我的服务关联,以便它接收消息 或

我已经用VC++写了一个服务。我跟着火车走。现在,我试图了解如何接收诸如DBT_DEVICEARRIVAL、DBT_DeviceMoveComplete、WM_COPYDATA等消息,就像具有顶级窗口的常规应用程序一样。在寻找它的时候,我偶然发现了它

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

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

但几乎不可能找到任何这样做的例子

  • 如何将WndProc与我的服务关联,以便它接收消息

  • 或者,如何使我的服务控制处理程序能够接收windows消息?我的服务控制处理程序只有一个DWORD参数,而不是WndProc的UINT、WPARAM、LPARAM等

  • 我读过关于1)使用隐藏窗口和2)只显示消息窗口等的文章,但我认为我无法在服务中使用它们;我不想。如果我能用MSDN提到的这两种方式中的任何一种来完成它,我会很高兴

    服务说明:

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

    将来,此基本功能可能会扩展到包括其他内容。因此,我可能必须能够接收许多我现在不知道的其他windows消息


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

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

    例如:

    while(GetMessage(...)) ...
    
    您可以使用
    peek消息
    或(参见链接文档)。但后者更为传统,将其从消息队列中移除

    也就是说,你甚至不需要窗户。每个线程都可以有一个消息循环。因此它将被阻塞,但只阻塞当前线程。你必须自己弄清楚如何将信息传递给另一个需要它的线程

    然而,大公司 但是,你应该使用适当的服务技术(从MMF到管道,再到信号量、互斥量和事件的组合,都有很多可用的技术),而不是去破坏MS为你提供的不让你的下半身受伤的东西

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

    将函数与回调函数一起使用


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

    好的替代方法+1在我看来,Handlerex是一个可行的选择。但它的控制代码列表似乎只涵盖了有限的一组事件。想知道这些代码(甚至扩展列表)是否涵盖了服务可能需要的所有内容吗?@Display Name:至于设备通知,这就足够了。但是,一旦你开始变得愚蠢(你读过我的答案了吗,特别是粗体标题后面的部分?)你就不仅仅是在自己,而是在积极反对系统的工作方式。我正在为此使用shell服务,但这是另一个故事。:)@显示名称:请告诉我们,为什么您在服务中需要您的问题中提到的
    WM_COPYDATA
    ?尝试过了。while循环阻止方法返回,因此我的服务甚至不会启动。知道如何放置它以使服务真正启动吗?@Display Name:每个线程都可以有自己的消息循环。谁强迫你把它放在“主”(即第一个)线程中?嗯,那么也许我应该把它放在服务工作者线程中?@Display Name:取决于你的意思。如果您是指服务的
    处理程序
    /
    HandlerEx
    ,那么问题仍然存在-您只会将其推迟到SCM接管后失败。Hmm。。我将尝试找出如何为msg循环使用线程并与其他线程通信。还有,谢谢你的链接。正在检查其他IPC技术。由于会话0隔离,您将无法收到许多消息。