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