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