在什么条件下允许进程使用 Win32 函数 SetForegroundWindow 设置前景窗口?

MXY*_*MXY 5 winapi

我想了解进程在什么条件下可以使用 Win32 函数设置前台窗口SetForegroundWindow。我尝试阅读它的文档,它在“备注”下说:

仅当满足以下条件之一时,进程才能设置前台窗口:

  • 该进程是前台进程。
  • 该进程是由前台进程启动的。
  • 该进程接收到最后一个输入事件。
  • 没有前台进程。
  • 进程正在调试中。
  • 前台进程不是现代应用程序或开始屏幕。
  • 前景未锁定(请参阅LockSetForegroundWindow)。
  • 前台锁定超时已过期(请参见SPI_GETFOREGROUNDLOCKTIMEOUT)SystemParametersInfo。
  • 没有菜单处于活动状态。

在我看来,这不可能准确,因为这意味着所有这些项目符号都必须为假才能限制设置前景窗口,但最后四个似乎通常是正确的(取决于您对“现代”应用程序的使用) )。正如所写的,设置前景窗口几乎永远不会受到限制。然而从实验来看,在另一个进程的窗口中激活菜单似乎足以阻止设置前台窗口,即使例如前台进程不是现代应用程序(条件 6 为真)。

当进程可以根据列出的条件设置前台窗口时,更准确的表达方式是什么?

dia*_*ler 5

MSDN 文档已多次迁移为不同的格式。每次微软这样做,文档都会受到影响。

窗口功能文章更正确:

系统限制哪些进程可以设置前台窗口。仅当满足以下条件时,进程才能设置前台窗口:

以下所有条件均成立:

  • 调用 SetForegroundWindow 的进程属于桌面应用程序,而不是 UWP 应用程序或专为 Windows 8 或 8.1 设计的 Windows 应用商店应用程序。
  • 前台进程尚未通过先前调用 LockSetForegroundWindow 函数来禁用对 SetForegroundWindow 的调用。
  • 前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。
  • 没有菜单处于活动状态。

此外,至少满足以下条件之一:

  • 调用进程是前台进程。
  • 调用进程是由前台进程启动的。
  • 当前没有前台窗口,因此没有前台进程。
  • 调用进程收到最后一个输入事件。
  • 前台进程或调用进程正在调试。

即使进程满足这些条件,也可能被拒绝设置前台窗口的权利。

请特别注意最后一句。所以,最好不要想太多,因为无论如何它都可能无缘无故地失败。