为什么窗口不登上顶部,使用setWindowpos的起源

Why is a window not coming to top, inspite using setwindowpos?

本文关键字:使用 setWindowpos 起源 顶部 窗口 为什么      更新时间:2023-10-16
 m_pMainWnd->SetForegroundWindow(); 
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

我使用上面的线将我的一个窗户置于顶部。但是令我失望的是,什么都没有发生。尽管使用<& cwnd :: wndtopmast>将窗户带到了最上方,但对此没有重点。VS15,MFC

对不起,但是您要问的是(琐碎)。您的窗口之所以不在顶部的原因是,您的应用程序不是前景应用程序(即 - 负责前景窗口的应用程序)。

在手册页上:

使用setWindowpos将窗口带到顶部,该过程 拥有窗口必须具有SetForegroundWindow的权限。

当然,您做到了。但是,您没有检查其返回代码。这是那个人页面要说的:

系统限制哪些过程可以设置前景窗口。A 过程仅在以下一个时才设置前景窗口 条件是正确的:

  • 该过程是前景过程。
  • 该过程是由前景过程开始的。
  • 该过程收到了最后一个输入事件。
  • 没有前景过程。
  • 该过程正在调试。
  • 前景过程不是现代应用程序或开始屏幕。
  • 前景未锁定(请参阅Lockset Foregroundwindow)。
  • 前景锁定超时已过期(请参阅SystemParameterSinfo中的Spi_getForegroundlockTimeout)。
  • 没有菜单活跃。

这些限制的总和是,很有可能,您无法将窗口变成前景窗口,而您无法将其转到前面。

有解决方案。您可以确保"前景过程"调用设置ForegroundWindow。不幸的是,这没有运行您的代码。

我不得不这样做的时候,我使用钩子将代码注入前景窗口的过程。这不是初学者的技巧。如果您不这样做,那么就无法做您要做的事情。

编辑为添加: Windows试图阻止您做自己想做的事情的原因是有原因的。从另一个应用程序中窃取焦点会为用户创造非常差的UI体验。请重新考虑您是否想要做自己想做的事。

您应该使用cwnd :: wndtopmast而不是cwnd :: wndtop。cwnd :: wndtopmest也会导致窗口即使停用也将保持最高。

请参阅文档:https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx

关于两者之间区别的一篇古老的新事物:https://blogs.msdn.microsoft.com/oldnewthing/20051121-10/?p=33263