winapi - 在服务中接收 Windows 消息

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

我用 VC++ 编写了一个服务。我关注了tutorial here .现在,我正在尝试了解如何接收 DBT_DEVICEARRIVAL、DBT_DEVICEREMOVECOMPLETE、WM_COPYDATA 等消息,就像具有顶级窗口的常规应用程序一样。搜索的时候发现this MSDN article

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

Applications receive messages through the window procedure of their top-level windows. Messages are not sent to child windows. Services can receive messages through a window procedure or their service control handlers.



但是几乎不可能找到任何如何做到这一点的例子。
  • 如何将 WndProc 与我的服务相关联,以便它接收消息?
  • 或者,我怎样才能让我的服务控制处理函数接收 Windows 消息?我的服务控制处理程序只有一个 DWORD 参数,而不是 WndProc 的 UINT、WPARAM、LPARAM 等。

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

    服务说明:

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

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

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

    最佳答案

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

    while(GetMessage(...)) ...
    
    您可以使用 PeekMessage GetMessage (请参阅链接的文档)。但后者更传统,并将其从消息队列中删除。
    IE。你甚至不需要 window 。每个线程都可以有一个消息循环。所以它会阻塞,但只有当前线程。您必须自己弄清楚如何将信息传递给需要它的其他线程。
    不过大
    但是,与其努力妥协 MS 为您提供的一些东西,不要让您的下半身掉下来,您应该 read about Shatter Attacks over on Wikipedia并使用正确的 IPC服务技术(有很多可用的技术,从 MMF 到管道,再到与信号量、互斥体和事件的组合)。
    如果您打算在用户桌面上接收窗口消息但使用您的特权上下文(无论如何都应该阻止 session 分离),这部分是相关的。

    关于winapi - 在服务中接收 Windows 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141529/

    相关文章:

    c++ - 如何在 Visual C++ 2008 中创建 UTF-8 字符串文字

    c++ - 转换为枚举类型需要显式转换(static_cast、C 风格转换或函数风格转换)枚举

    winapi - 是否有用于选择 Active Directory 用户的通用对话框?

    c++ - win32 C++ 上的按钮样式

    c++ - 显示描述文本 (WINAPI)

    c++ - 无法通过 CreateProcess API 打开 chrome 浏览器

    c++ - 循环依赖问题

    service - 无法启动Docker守护程序

    performance - 解决可扩展性

    MySQL 服务不再启动