向由其他windows启动的应用程序发送消息';用户会话

向由其他windows启动的应用程序发送消息';用户会话,windows,messages,accounts,Windows,Messages,Accounts,一个桌面应用程序(Delphi制作)由用户A启动。我们称它为“实例A” 用户A执行“切换用户”,用户B登录 用户B运行相同的应用程序。我们称之为“实例B” 我现在想要的是实例B向实例a发送消息的一种方式 我尝试了以下方法:实例A将其句柄写入一个文件,因此实例B可以打开该文件,读取句柄,并使用它向实例A发布消息,但它不起作用——可能是出于安全原因,Windows不允许一个用户访问另一个用户正在运行的进程的句柄 一种“糟糕”的方法是让实例A每隔几秒钟检查一个特定的文件或注册表位置,这样实例B就可以在

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

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

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

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

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

一种“糟糕”的方法是让实例A每隔几秒钟检查一个特定的文件或注册表位置,这样实例B就可以在那里写一些东西,实例A就会得到它。。。但这显然是一个繁重而不公平的解决方案

相反,我需要的是一种方法,例如用户B的实例B向用户a的实例a发送一条无害的消息,然后实例a醒来并决定如何处理该消息


谢谢你的建议

这与在系统帐户下运行windows服务并让某个应用程序的用户实例与之通信的问题本质上不一样吗?然后,也许您应该搜索进程间通信(命名管道等)

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


阅读MSDN上的命名管道。

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

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

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

更多信息请点击此处: 在这里:

感谢您提供有关命名管道的提示,这可能确实是正确的方法。