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