我正在尝试向在不同用户帐户下运行的应用程序发送消息(在计算机上也使用不同帐户登录的用户,在 XP 及更高版本上使用快速用户切换,并执行该应用程序) .
背景是我的应用程序可以自行更新,但为了做到这一点,必须首先关闭所有正在运行的实例。
需要关闭实例(而不是仅仅终止进程),因此更新程序通过向它们发送自定义消息(使用 SendMessage
)来实现这一点。为了发送消息,我需要进程主窗口的句柄。
使用 EnumWindows
就可以正常工作 - 只要实例在同一用户帐户下运行,因为 EnumWindows
不会列出属于不同用户的窗口。
所以我尝试了不同的方法。我使用 CreateToolhelp32Snapshot 首先列出系统上所有正在运行的进程,然后再次调用 CreateToolhelp32Snapshot 的线程进行迭代。有了这些线程 ID,我就可以使用 EnumThreadWindows
列出它们的窗口。
这再次工作正常,但是..再次仅适用于当前登录的用户。这里的问题是,即使 CreateToolhelp32Snapshot 列出了属于不同用户的进程 ID,它也没有列出属于它们的线程 ID。此代码有点长,但如果需要,我可以对其进行编辑 - 请对此发表评论。
那么,如何获取在不同登录用户帐户上运行的应用程序的主窗口句柄?
最佳答案
使用已知可跨 session 工作的东西;这类东西通常用于桌面服务通信,因此如果您想用谷歌搜索,请寻找它。这是我的建议:
- 创建一个仅用于触发“需要关闭”状态的事件。使用CreateEvent函数请确保您的名称以
Global\
开头,这样它在各个 session 中都有效。 - 在应用程序启动时,创建一个打开指定事件的线程(使用相同的
CreateEvent
函数,请密切注意ERROR_ALREADY_EXISTS
非错误)。该线程应该简单地等待该事件。当事件被触发时,将所需的消息发送到主窗口。该线程可以轻松安全地执行此操作,因为它在您的进程内运行。线程大部分时间都处于空闲状态,等待事件被触发,因此不必担心 CPU 损失。 - 您的应用更新程序应该简单地触发指定的事件。
这只是一个想法,我相信还有其他想法。
关于delphi - 向在辅助登录用户帐户上运行的应用程序发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455020/