gpt4 book ai didi

c++ - 尽管使用了 setwindowpos,为什么窗口没有出现在顶部?

转载 作者:行者123 更新时间:2023-11-28 00:02:06 32 4
gpt4 key购买 nike

 m_pMainWnd->SetForegroundWindow(); 
m_pMainWnd->SetWindowPos(&CWnd::wndTop, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);

我使用上面的代码将我的一个窗口置于顶部。但令我失望的是,什么也没有发生。虽然使用 <&CWnd::wndTopMost> 将窗口带到最顶层,但没有关注它。VS15、mfc

最佳答案

很抱歉,但您所问的(微不足道)是不可能的。您的窗口没有出现在顶部的原因是因为您的应用程序不是前台应用程序(即 - 负责前台窗口的应用程序)。

来自manual page :

To use SetWindowPos to bring a window to the top, the process that owns the window must have SetForegroundWindow permission.

当然,你做到了。但是,您没有检查它的返回码。这就是man page不得不说:

The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

  • The process is the foreground process.
  • The process was started by the foreground process.
  • The process received the last input event.
  • There is no foreground process.
  • The process is being debugged.
  • The foreground process is not a Modern Application or the Start Screen.
  • The foreground is not locked (see LockSetForegroundWindow).
  • The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
  • No menus are active.

这些限制的总和就是,您很可能无法将窗口变成前景窗口,也无法将其置于最前面。

有很多方法可以解决这个问题。您可以确保前台进程调用 SetForegroundWindow。不幸的是,那没有运行您的代码。

有一次我不得不这样做,我使用了 hooks为了将我的代码注入(inject)到前台窗口的进程中。这不是初学者的把戏。如果你做不到这一点,那么就没有办法做你想做的事。

编辑添加:Windows 试图阻止您执行您正在尝试执行的操作是有原因的。从另一个应用程序中窃取焦点会给用户带来非常糟糕的 UI 体验。请重新考虑您是否想要做您正在尝试做的事情。

关于c++ - 尽管使用了 setwindowpos,为什么窗口没有出现在顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38119347/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com