Windows 服务向用户窗口发送消息是不是有特殊考虑?

Posted

技术标签:

【中文标题】Windows 服务向用户窗口发送消息是不是有特殊考虑?【英文标题】:Are there special considerations for a windows service to send messages to user windows?Windows 服务向用户窗口发送消息是否有特殊考虑? 【发布时间】:2009-03-05 15:13:19 【问题描述】:

我必须编写一个 Windows 服务应用程序(无 GUI)来监视一个事件,如果它发生,将向应用程序发送一个标准的 Windows 消息。应用程序的句柄将由 DLL 提供给服务,然后卸载,因此我们希望使用 windows 消息。

但问题是服务是否需要做一些特殊的事情来使用 SendMessage 到窗口句柄,因为它可能在不同的屏幕上或 Vista 中的某个东西上。这可能吗,如果可以,请问我该怎么办?

【问题讨论】:

【参考方案1】:

用户界面权限隔离 (UIPI):

Microsoft Windows Vista 及更高版本。 消息发送以用户为准 接口特权隔离 (UIPI)。 进程的线程可以发送 消息只发送到消息队列 在较小的进程中的线程或 相同的完整性级别。

Source

你可以阅读User Interface Privilege Isolation (UIPI) here。

要解决这个问题,您可以在清单文件中将 uiAccess 设置为 true。您还必须确保您的应用程序是使用验证码和来自 VeriSign 等签名机构的证书进行签名的。这可能会变得非常昂贵。


会话 0 隔离:

我也相信您不能跨会话调用 SendMessage。因此,如果您有一个在会话 0 中运行的服务,您需要找到另一种方法来与您的进程进行通信,该方法将在会话 > 0 中运行。例如:通过管道。

在 Windows Vista、Windows 2008 Server 和更高版本中,所有服务都在会话 0 中运行,而您启动的所有应用程序都在会话 > 0 中运行。这称为会话 0 隔离。这是一个包含information all about session 0 isolation 的好文档。

如果您无权访问要向其发送消息的程序的源,您可以通过创建一个与您的服务通信并充当代理将消息中继到应用程序的应用程序来解决此问题它的同一个会话。


总体:

如果您在 Vista 之前的版本上开发您的应用程序并且它可以正常工作。它在 Vista 中被破坏的可能性非常高

【讨论】:

不管它是否正确,这都是一些很好的信息。 这听起来很糟糕。澄清:我对手头的主题了解得不够多,不知道这是否有用,但我觉得这些信息通常很有用,所以我给了它一个 +1。 :) 谢谢,我认为发帖者会遇到这两个问题。但我也没有他的问题的确切细节。 谢谢。我会接受这个答案——这个问题需要用另一种方式来解决,所以我现在就问一个 DLL 问题!

以上是关于Windows 服务向用户窗口发送消息是不是有特殊考虑?的主要内容,如果未能解决你的问题,请参考以下文章

尝试从扩展包中的 html 窗口向内容脚本发送消息

用C#调用Windows API向指定窗口发送按键消息

Windows 程序基础

回炉重造之重读Windows核心编程-026- 窗口消息

xmpphp XMPP,从 php 脚本发送消息

您能否确定是不是可以使用 discord.py 直接向用户发送消息?