Windows服务向用户窗口发送消息是否有特殊注意事项?
-
03-07-2019 - |
题
我必须编写一个监视事件的Windows服务应用程序(没有GUI),如果它发生,将向应用程序发送标准的Windows消息。应用程序的句柄将通过DLL被提供给服务,然后卸载,因此Windows消息是我们希望使用的方式。
问题是,服务是否需要做任何特殊的事情才能将SendMessage用于窗口句柄,因为它可能位于不同的屏幕或Vista中。这是可能的,如果可以的话,我该怎么办?
解决方案
用户界面权限隔离(UIPI):
Microsoft Windows Vista及更高版本。 消息发送受用户约束 接口权限隔离(UIPI)。 进程的线程可以发送 仅消息到消息队列 较小或过程中的线程 同等诚信水平。
您可以在此处阅读用户界面权限隔离(UIPI)。
要解决此问题,您可以在清单文件中将uiAccess设置为true。您还必须确保使用来自签名机构(如VeriSign)的证书的authenticode对您的应用程序进行签名。这可能会非常昂贵。
会话0隔离:
我也相信你不能跨会话调用SendMessage。因此,如果您在会话0中运行服务,则需要找到另一种与会话中正在运行的流程进行通信的方法>例如:通过管道。
在Windows Vista中,Windows 2008 Server及更高版本的所有服务都在会话0中运行,并且您开始在会话中运行的所有应用程序>这称为会话0隔离。这是一份很好的文档,其中包含所有关于会话0隔离的信息。
如果您无法访问要向其发送消息的程序源,则可以通过创建与您的服务进行通信的应用程序并充当代理将消息中继到应用程序来解决此问题。同一会议。
<强>总体:强>
如果您在Vista之前开发应用程序,它可以正常工作。在Vista中有一个非常高的可能性。