将消息发送到在辅助登录用户帐户上运行的应用程序

Chr*_*ris 11 delphi winapi

我正在尝试向在不同用户帐户下运行的应用程序发送消息(用户也在计算机上使用其他帐户登录,在XP及更高版本上使用快速用户切换,并执行应用程序).

背景是我的应用程序可以自行更新,但为了做到这一点,必须首先关闭所有正在运行的实例.
需要关闭实例(而不是仅仅杀死进程),因此更新程序通过向它们发送自定义消息来执行此操作(使用SendMessage).为了发送消息,我需要一个进程主窗口的句柄.

这样可以正常使用EnumWindows- 只要实例在同一个用户帐户下运行,因为EnumWindows不会列出属于不同用户的窗口.

所以我尝试了不同的方法.我曾经CreateToolhelp32Snapshot首先列出系统上所有正在运行的进程,然后CreateToolhelp32Snapshot再次遍历调用的线程.通过这些线程ID,我可以使用它列出他们的窗口EnumThreadWindows.

再一次,这工作正常,但..再次只对当前登录用户.这里的问题是,即使CreateToolhelp32Snapshot列出属于不同用户的进程ID,它也不会列出属于它们的线程ID.这段代码有点冗长,但如果需要我可以编辑它 - 请留言.

那么,我怎样才能让我的应用程序的主窗口句柄在不同的登录用户帐户上运行?

Cos*_*und 10

使用已知可以跨会话工作的东西; 这种东西通常用于桌面服务通信,所以如果你想google,那就找.这是我的建议:

  1. 创建一个仅用于触发"需要关闭"状态的事件.使用CreateEvent函数确保您启动您的名称,Global\以便它在会话中有效.
  2. 在应用程序启动时创建一个打开命名事件的线程(使用相同的CreateEvent功能,密切注意ERROR_ALREADY_EXISTS非错误).该线程应该只是等待事件.触发事件后,将所需消息发送到主窗口.该线程可以轻松安全地执行此操作,因为它您的进程运行.线程将主要处于空闲状态,等待事件被触发,因此不必担心CPU损失.
  3. 您的应用程序更新程序应该只是触发命名事件.

这只是一个想法,我相信还有其他想法.


arx*_*arx 7

管道有点矫枉过正.导致应用程序实例自杀的全局手动重置事件(例如"Global\MyApplicationShutdownEvent")就足够了.

  • +1我怀疑你能做到比这简单得多. (2认同)