如何从窗口中删除TOPMOST属性

时间:2019-06-11 10:41:45

标签: c++ winapi

我有一个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所看到的,它应该工作吗?

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

2 个答案:

答案 0 :(得分:0)

您在问题中提供的文档链接指示您应将services.AddAutoMapper(cfg => { cfg.ValidateInlineMaps = true; ...other config stuff }, typeof(AutomapProfileGen)); 传递给HWND_NOTOPMOST。关于该标志,它说:

  

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

答案 1 :(得分:0)

使用SetWindowLongPtr。 此功能将舍弃您的窗口样式,但是您可以将其还原,例如以下示例 下方:

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

重要说明:

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

希望这行得通。