From 704459225b03ab69e4e91dd8d28f8a617a01ab89 Mon Sep 17 00:00:00 2001 From: ge0rdi Date: Thu, 1 Dec 2022 20:57:24 +0100 Subject: [PATCH] Properly handle automatically hiding taskbar on multi-monitor setup When taskbar is hidden its window is moved off the screen (except for few pixels at border). It may happen that the taskbar window actually spans to another monitor (though still not visible). MonitorFromWindow API may thus return different monitor handle than the one visible taskbar is on. We will use GetTaskbarPosition function that correctly identifies taskbar's monitor by checking rectangle of visible taskbar. Fixes #908 --- Src/StartMenu/StartMenuDLL/MenuContainer.cpp | 3 +++ Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp index 0de4d05..ac9b872 100644 --- a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp +++ b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp @@ -7652,6 +7652,9 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr // initialize all settings bool bErr=false; HMONITOR initialMonitor=MonitorFromWindow(s_TaskBar,MONITOR_DEFAULTTONEAREST); + // note: GetTaskbarPosition properly identifies monitor in case of multi-monitor setup and automatic taskbar hiding + GetTaskbarPosition(s_TaskBar,NULL,&initialMonitor,NULL); + int dpi=CItemManager::GetDPI(true); if (!CItemManager::GetDPIOverride() && GetWinVersion()>=WIN_VER_WIN81) { diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index 6a0ec53..8857fa3 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -617,12 +617,12 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R if (pRc->right>rc.right) pRc->right=rc.right; } } + HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST); + if (pMonitor) *pMonitor=monitor; if (pInfo) { pInfo->cbSize=sizeof(MONITORINFO); - HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST); GetMonitorInfo(monitor,pInfo); - if (pMonitor) *pMonitor=monitor; } return appbar.uEdge; }