桌面应用程序(用Delphi制作)由用户A启动。我们称之为“实例A”。
用户A执行“切换用户”,用户B登录。
用户B运行相同的应用程序。我们称之为“实例B”
我现在想要的是实例B向实例A发送消息的方法。
我尝试了以下操作:实例A将其句柄写入文件,因此实例B可以打开该文件,读取句柄,并使用它向实例A发送消息,但它不起作用 - 也许对于安全原因Windows不允许一个用户访问另一个用户正在运行的进程的句柄...
执行此操作的“坏”方法是让实例A每隔几秒检查一个特定的文件或注册表位置,因此实例B可以在那里写一些东西而实例A会得到它......但这显然是一个负担和不优雅的解决方案。
而我需要的是用户B的实例B向用户A的实例A发送无害消息的方式,然后实例A唤醒并决定要对其进行处理。
感谢您的任何建议!
答案 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。