我有一个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所看到的,它应该工作吗?
是正确的,还是有另一种方法可以实现这一目标?
答案 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函数的调用。
希望这行得通。