[英]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.