delphi - 向在辅助登录用户帐户上运行的应用程序发送消息

标签 delphi winapi

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

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

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

所以我尝试了不同的方法。我使用 CreateToolhelp32Snapshot 首先列出系统上所有正在运行的进程,然后再次调用 CreateToolhelp32Snapshot 的线程进行迭代。有了这些线程 ID,我就可以使用 EnumThreadWindows 列出它们的窗口。

这再次工作正常,但是..再次仅适用于当前登录的用户。这里的问题是,即使 CreateToolhelp32Snapshot 列出了属于不同用户的进程 ID,它也没有列出属于它们的线程 ID。此代码有点长,但如果需要,我可以对其进行编辑 - 请对此发表评论。

那么,如何获取在不同登录用户帐户上运行的应用程序的主窗口句柄?

最佳答案

使用已知可跨 session 工作的东西;这类东西通常用于桌面服务通信,因此如果您想用谷歌搜索,请寻找它。这是我的建议:

  1. 创建一个仅用于触发“需要关闭”状态的事件。使用CreateEvent函数请确保您的名称以 Global\ 开头,这样它在各个 session 中都有效。
  2. 在应用程序启动时,创建一个打开指定事件的线程(使用相同的 CreateEvent 函数,请密切注意 ERROR_ALREADY_EXISTS 非错误)。该线程应该简单地等待该事件。当事件被触发时,将所需的消息发送到主窗口。该线程可以轻松安全地执行此操作,因为它在您的进程内运行。线程大部分时间都处于空闲状态,等待事件被触发,因此不必担心 CPU 损失。
  3. 您的应用更新程序应该简单地触发指定的事件。

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

关于delphi - 向在辅助登录用户帐户上运行的应用程序发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9455020/

相关文章:

forms - Delphi,按名称查找表格

delphi - RichEdit 控件在成为其他控件的父控件时停止绘制文本

c++ - 如何使用 Windows x64 记录堆栈帧

winapi - 学习 win32 API 值得吗?

c++ - 使用 ShellExecute 的进程之间的 IPC

mysql - 德尔福 2010 和 MySQL

delphi - 使用Pascal脚本验证字符串字符为数字(FastReport 4)

delphi - @映射方法入口点时的运算符用法

python - 如何检查启用了哪个 XP 主题

c++ - 将 MS HANDLE 初始化为 nullptr 是否安全?