首先,我知道这是一个有争议的讨论,但我希望我们能够保持技术性。
我有一个在后台启动的应用程序,我希望它能够在不同的进程中激活/聚焦窗口。但是,即使我要激活其窗口的进程已调用AllowSetForegroundWindow(ASFW_ANY),调用SetForegroundWindow也总是会失败。
原因是(IMO)启动应用程序是后台进程,并且由于它尚未收到输入,因此不允许设置前台窗口。因此,所有内容都会显示在任务列表中,但不会显示。
所以我尝试创建一个虚拟窗口来接收立即关闭的输入然后能够成功调用SetForegroundWindow。但即使是我显示的虚拟窗口也会显示在背景中。
However,如果我打电话
AttachThreadInput(
GetWindowThreadProcessId(GetForegroundWindow(), NULL),
GetCurrentThreadId(), TRUE);
在创建虚拟窗口之前,该窗口确实是在前台创建的,我可以然后在不同的进程中为不同的 HWND 调用 SetForegroundWindow 是可行的。
但是:如果我不创建虚拟窗口,尽管我使用 AttachThreadInput,SetForegroundWindow 仍然返回零。
我不明白为什么如果我创建自己的窗口,AttachThreadInput hack 会成功(之后其他窗口也会成功),但如果我不先创建自己的窗口,那么 AttachThreadInput hack 就会失败。
我的后台进程如何在不同进程中的不同窗口上调用 SetForegroundWindowwithout创建一个虚拟窗口?
[*] 后台应用程序实际上是 gpg-agent.exe,每当请求密码时,它就会调用 pinentry.exe(我的应用程序)。 pinentry.exe(作为后台进程运行)必须从另一个正在运行的应用程序请求密码,因此它必须将其窗口带到前台......