首页 > 解决方案 > 如何从窗口中删除 TOPMOST 属性

问题描述

我有一个创建两个单独窗口的 Windows C++ 应用程序

我需要能够暂时将一个窗口置于最顶层,然后删除该属性,以便其他窗口可以覆盖它。

我试过这段代码:

void setWindowAlwaysOnTop(const std::string& windowTitle, bool onTop) {
    HWND hwnd = FindWindowA(NULL, windowTitle.c_str());
    HWND insertAfter;
    if (onTop) insertAfter = HWND_TOPMOST;  //set the window always-on-top    
    else insertAfter = HWND_BOTTOM; 
    SetWindowPos(hwnd, insertAfter, NULL, NULL, NULL, NULL, SWP_NOMOVE | SWP_NOSIZE);
}

但是,如果我之前使用 onTop true 调用此代码,则在我使用 onTop false 调用它之后,它不会重新允许其他窗口覆盖目标窗口。

我也尝试从目标窗口本身而不是从单独的窗口调用该函数,但它仍然不起作用。

据我在 https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos看到的,它应该可以工作吗?

这是正确的,还是有其他方法可以实现?

标签: c++winapi

解决方案


您在问题中提供的文档链接表明您应该传递HWND_NOTOPMOSThWndInsertAfter. 在这面旗帜中,它说:

将窗口放置在所有非最顶层窗口的上方(即,在所有最顶层窗口的后面)。如果窗口已经是非最顶层窗口,则此标志无效。


推荐阅读