如何使用 WinAPI 和 C++ 从 Windows 系统上的服务通知客户端应用程序?

Posted

技术标签:

【中文标题】如何使用 WinAPI 和 C++ 从 Windows 系统上的服务通知客户端应用程序?【英文标题】:How to notify client applications from a service on a Windows system with WinAPI and C++? 【发布时间】:2012-04-14 22:41:23 【问题描述】:

我想知道,在 Windows 系统上使用 C++/WinAPI 执行以下操作的最佳方法是什么?

我有一个本地服务应用程序以及正在运行的客户端应用程序(在每个登录的用户会话帐户上运行。)服务应用程序需要通知所有客户端应用程序执行一次性操作(例如,从注册表和进程读取数据它。)你如何实现这种通知所有客户端应用程序一次性事件的机制?

【问题讨论】:

【参考方案1】:

服务可以发送所有客户端应用程序都会监听的广播窗口消息。当然,客户端应用程序需要有一个消息循环。你看过SendNotifyMessage函数吗?

【讨论】:

嗯,很有趣。我没有考虑。我唯一担心的是,它会跨会话工作吗?例如,如果客户端应用程序在登录的会话 1 和会话 2 中运行,两个副本都会收到此消息吗? 我实际上是这样做的——客户端应用程序通过将其会话 ID 附加到其名称来创建一个全局命名事件。可以从 ProcessIdToSessionId API 获取它。然后客户端可以等待它收到信号。然后通知客户端,服务打开每个事件并单独发出信号。该服务可以通过调用 WTSEnumerateSessions 获取所有登录用户的会话 ID。这有点复杂,但似乎不需要消息循环就可以工作。 刚刚通过试用了解到,SendNotifyMessage 不会像上面建议的那样工作。我在上面帖子中描述的方法将... 应用程序在不同的登录会话下运行并不是很明显。这可能就是 SendNotifyMessage 不适合您的原因。很高兴听到您最终解决了您的问题。 即使它只是一个登录的用户会话也不会起作用。这是从 Windows Vista 开始引入的——它被称为“会话隔离”,这意味着无法从系统服务向用户进程发送消息。【参考方案2】:

您可以使用具有所有应用都同意的特定名称的event。然后在一段时间后重置它。

【讨论】:

是的,我明白这一点。但是你看,问题是如何只做一次?如果我创建手动重置事件,每个客户端应用程序将检查是否通过调用 WaitForSingleObject 设置了此类事件,并无限期地继续这样做。另一方面,如果我创建了一个自动重置事件,那么只有一个客户端应用会收到通知,但其余的呢?

以上是关于如何使用 WinAPI 和 C++ 从 Windows 系统上的服务通知客户端应用程序?的主要内容,如果未能解决你的问题,请参考以下文章

使用winapi从桌面打开C++文件

如何使用 C++ 和 winAPI 检查目录是不是存在 [重复]

如何使用 WinAPI 在 C++ 中制作带有标签的旋转框的窗口

如何在纯 C++ 中高效快速地清理我的 GDI 对象 - winapi(不是 .net,c#)?

简单的匿名管道 - 您使用啥包装器模型? (WinAPI, C++)

如何从 ip 地址或 sockaddr_in 结构 (C++/WinAPI) 中获取主机名?