加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

winapi – 在服务中接收Windows消息

发布时间:2020-12-14 03:51:29 所属栏目:Windows 来源:网络整理
导读:我在VC写了一个服务.我关注了 tutorial here.现在,我正在尝试了解如何接收DBT_DEVICEARRIVAL,DBT_DEVICEREMOVECOMPLETE,WM_COPYDATA等消息,就像具有顶级窗口的常规应用程序一样.在搜索时,我遇到了 this MSDN article 在“广播信息”部分的最后几段中: Appli
我在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(请参阅链接的文档).但后者更常规,并将其从消息队列中删除.

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

但是很大

但是,不要努力妥协MS为你提供的东西不要射击你自己的下半身,你应该read about Shatter Attacks over on Wikipedia并使用适当的IPC技术进行服务(有很多可用的,从MMF到管道到信号量组合,互斥量和事件).

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读