将消息发送到由不同的Windows用户会话启动的应用程序

时间:2009-11-04 12:32:18

标签: windows messages accounts

桌面应用程序(用Delphi制作)由​​用户A启动。我们称之为“实例A”。

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

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

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

我尝试了以下操作:实例A将其句柄写入文件,因此实例B可以打开该文件,读取句柄,并使用它向实例A发送消息,但它不起作用 - 也许对于安全原因Windows不允许一个用户访问另一个用户正在运行的进程的句柄...

执行此操作的“坏”方法是让实例A每隔几秒检查一个特定的文件或注册表位置,因此实例B可以在那里写一些东西而实例A会得到它......但这显然是一个负担和不优雅的解决方案。

而我需要的是用户B的实例B向用户A的实例A发送无害消息的方式,然后实例A唤醒并决定要对其进行处理。

感谢您的任何建议!

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

在MSDN上阅读有关命名管道的here