2

用户 A 启动了一个桌面应用程序(用 Delphi 制作)。我们称它为“实例 A”。

用户 A 执行“切换用户”,用户 B 登录。

用户 B 运行相同的应用程序。我们称它为“实例 B”

我现在想要的是实例 B 向实例 A 发送消息的一种方式。

我尝试了以下方法:实例 A 将其句柄写入文件,因此实例 B 可以打开该文件、读取句柄并使用它向实例 A 发布消息,但它不起作用——可能是出于安全原因 Windows不让一个用户访问另一个用户正在运行的进程的句柄......

这样做的“坏”方法是让实例 A 每隔几秒钟检查一次特定的文件或注册表位置,这样实例 B 可以在那里写一些东西,实例 A 会得到它……但这显然是一个繁琐且不雅的解决方案.

相反,我需要的是用户 B 的实例 B 向用户 A 的实例 A 发送无害消息的方法,之后实例 A 唤醒并决定如何处理它。

感谢您的任何建议!

4

2 回答 2

3

您不能使用 SendMessage、PostMessage 和类似功能,因为来自不同用户会话的应用程序实例对您的应用程序不可用。

您可以使用全局命名空间中的命名管道、信号量等(即名称以“Global\”为前缀)。然后,在您的应用程序中创建一个单独的线程,例如,它将休眠直到来自其中一个的“信号”到达并相应地通知主窗口。

要节省资源,请使用 WTSRegisterSessionNotification 在会话切换发生时获得通知,并仅在该点创建线程。

更多信息在这里:http: //support.microsoft.com/kb/310153 和这里:http: //msdn.microsoft.com/en-us/library/ms997634.aspx

于 2009-11-04T15:09:19.817 回答
1

这与在系统帐户下运行 Windows 服务并让某些应用程序的用户实例与之通信本质上不是相同的问题吗?那么也许你应该谷歌进行进程间通信(命名管道等)。

您也可以使用 UDP 或 TCP/IP,但我想使用命名管道更适合“本地”通信(尽管我从未真正这样做过)。

MSDN 上阅读有关命名管道的信息。

于 2009-11-04T13:12:44.933 回答