[英]Borderless Window Covers Taskbar
我有一个定制的无边框窗口。 最大化时,它会覆盖任务栏。 这不是我想要的。 我玩过WM_GETMINMAXINFO
消息。 但是,我发现 Windows 10 会在底部和右侧留下额外的 8 像素间隙。 这是一个全有或全无的命题。 这是我尝试的第一个代码:
case WM_GETMINMAXINFO:
PMINMAXINFO pmm;
pmm = (PMINMAXINFO)lParam;
pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);
pmm->ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN);
return 0;
这样做的结果与我的结果相同,没有挂钩WM_GETMINMAXINFO
消息。 所以,我从底部敲了两个像素,这样我就可以访问任务栏(处于“自动隐藏”模式):
case WM_GETMINMAXINFO:
PMINMAXINFO pmm;
pmm = (PMINMAXINFO)lParam;
pmm->ptMaxSize.x = GetSystemMetrics(SM_CXSCREEN);
pmm->ptMaxSize.y = GetSystemMetrics(SM_CYSCREEN)-2;
return 0;
突然,我底部有一个10像素的间隙,右侧有一个新的8 像素间隙! 这似乎是 Windows 10 的事情,因为这在 Win7 中从未发生过。 我也试过SystemParametersInfo
,调用SPI_GETWORKAREA
(而不是GetSystemMetrics()
)。 这会产生相同的结果。
据我所知,问题不WM_GETMINMAXINFO
。 相反,我需要将命令放入我的代码中,以将任务栏保持在顶部。 我已经搜索了 Windows 样式。 但是,我在那里找不到任何帮助。
有谁知道如何解决这个关键问题。
好吧,我在一个最不可能的地方找到了答案。 有人试图用 Python 代码操纵边界。 从他们的尝试中,我能够为无边界窗口设计一个 C++ 解决方案。 结果如下:
首先,我用WS_OVERLAPPEDWINDOW | WS_VISIBLE
创建了一个窗口WS_OVERLAPPEDWINDOW | WS_VISIBLE
WS_OVERLAPPEDWINDOW | WS_VISIBLE
样式,启用所有 Windows 功能。 然后我使用以下代码处理WM_NCCALCSIZE
消息:
case WM_NCCALCSIZE:
{
WINDOWPLACEMENT wp;
LPNCCALCSIZE_PARAMS szr;
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
szr = LPNCCALCSIZE_PARAMS(lParam);
if (wp.showCmd == SW_SHOWMAXIMIZED) szr->rgrc[0].bottom -= (WFRAME+2);
return 0;
}
在上面的代码中,我从第一个矩形的底部减去边框的宽度。 添加了额外的 2 个像素,以暴露自动隐藏的任务栏。 最大化的窗口现在正常运行,允许访问任务栏。
为了在这个无边框窗口中创建我的虚拟客户区,我在WM_CREATE
和WM_SIZE
处理程序中添加了这段代码:
WINDOWPLACEMENT wp;
GetWindowRect(hWnd, &rWnd);
GetClientRect(hWnd, &rClient);
wp.length = sizeof(WINDOWPLACEMENT);
GetWindowPlacement(hWnd, &wp);
rClient.left += WFRAME; rClient.right -= WFRAME; rClient.top += (WFRAME+cyMenu);
if (wp.showCmd == SW_SHOWNORMAL) rClient.bottom -= WFRAME;
cxClient = rClient.right-rClient.left;
cyClient = rClient.bottom-rClient.top;
元素cyMenu
是为我的虚拟菜单栏保留的空间。 它将包含一系列按钮,模拟菜单和最小/最大/关闭按钮。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.