我想了解进程在什么条件下可以使用 Win32 函数设置前台窗口SetForegroundWindow。我尝试阅读它的文档,它在“备注”下说:
仅当满足以下条件之一时,进程才能设置前台窗口:
- 该进程是前台进程。
- 该进程是由前台进程启动的。
- 该进程接收到最后一个输入事件。
- 没有前台进程。
- 进程正在调试中。
- 前台进程不是现代应用程序或开始屏幕。
- 前景未锁定(请参阅
LockSetForegroundWindow)。- 前台锁定超时已过期(请参见
SPI_GETFOREGROUNDLOCKTIMEOUT)SystemParametersInfo。- 没有菜单处于活动状态。
在我看来,这不可能准确,因为这意味着所有这些项目符号都必须为假才能限制设置前景窗口,但最后四个似乎通常是正确的(取决于您对“现代”应用程序的使用) )。正如所写的,设置前景窗口几乎永远不会受到限制。然而从实验来看,在另一个进程的窗口中激活菜单似乎足以阻止设置前台窗口,即使例如前台进程不是现代应用程序(条件 6 为真)。
当进程可以根据列出的条件设置前台窗口时,更准确的表达方式是什么?
MSDN 文档已多次迁移为不同的格式。每次微软这样做,文档都会受到影响。
窗口功能文章更正确:
系统限制哪些进程可以设置前台窗口。仅当满足以下条件时,进程才能设置前台窗口:以下所有条件均成立:
- 调用 SetForegroundWindow 的进程属于桌面应用程序,而不是 UWP 应用程序或专为 Windows 8 或 8.1 设计的 Windows 应用商店应用程序。
- 前台进程尚未通过先前调用 LockSetForegroundWindow 函数来禁用对 SetForegroundWindow 的调用。
- 前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。
- 没有菜单处于活动状态。
此外,至少满足以下条件之一:
- 调用进程是前台进程。
- 调用进程是由前台进程启动的。
- 当前没有前台窗口,因此没有前台进程。
- 调用进程收到最后一个输入事件。
- 前台进程或调用进程正在调试。
即使进程满足这些条件,也可能被拒绝设置前台窗口的权利。
请特别注意最后一句。所以,最好不要想太多,因为无论如何它都可能无缘无故地失败。