繁体   English   中英

如何从窗口中删除TOPMOST属性

[英]How to remove TOPMOST attribute from a window

我有一个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调用此代码,则在使用onTop false调用后,它不会重新允许其他窗口覆盖目标窗口。

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

据我所知,在https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setwindowpos它可以工作吗?

这是正确的,还是有另一种方法来实现这一目标?

您在问题中提供的文档链接表明您应该将HWND_NOTOPMOST传递给hWndInsertAfter 这面旗帜说:

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

使用SetWindowLongPtr 此函数将丢弃您的窗口样式,但您可以恢复它们,如下例所示:

SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW); //Discard WS_EX_TOPMOST

重要的提示:

要编写与32位和64位版本的Windows兼容的代码,请使用SetWindowLongPtr。 在编译32位Windows时,SetWindowLongPtr被定义为对SetWindowLong函数的调用。

希望这有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM