From f115b4b9f5c6df8b5aad52271f7a827e72085947 Mon Sep 17 00:00:00 2001 From: Valentin Radu Date: Mon, 25 Oct 2021 05:55:15 +0300 Subject: [PATCH] Added experimental option for custom primary taskbar placement --- ExplorerPatcher/dllmain.c | 50 ++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index 3ea4ca2..fbebb78 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -63,6 +63,7 @@ DWORD bDisableImmersiveContextMenu = FALSE; DWORD bClassicThemeMitigations = FALSE; DWORD bHookStartMenu = TRUE; DWORD bNoMenuAccelerator = FALSE; +DWORD bTaskbarMonitorOverride = 0; HMODULE hModule = NULL; HANDLE hSettingsMonitorThread = NULL; HANDLE hDelayedInjectionThread = NULL; @@ -2723,28 +2724,28 @@ void WINAPI LoadSettings(BOOL bIsExplorer) dwSize = sizeof(DWORD); RegQueryValueExW( hKey, - TEXT("ClassicThemeMitigations"), + TEXT("HookStartMenu"), 0, NULL, - &bClassicThemeMitigations, + &bHookStartMenu, &dwSize ); dwSize = sizeof(DWORD); RegQueryValueExW( hKey, - TEXT("HookStartMenu"), + TEXT("NoMenuAccelerator"), 0, NULL, - &bHookStartMenu, + &bNoMenuAccelerator, &dwSize ); dwSize = sizeof(DWORD); RegQueryValueExW( hKey, - TEXT("NoMenuAccelerator"), + TEXT("TaskbarMonitorOverride"), 0, NULL, - &bNoMenuAccelerator, + &bTaskbarMonitorOverride, &dwSize ); RegCloseKey(hKey); @@ -3549,6 +3550,42 @@ LSTATUS explorer_RegGetValueW( return lRes; } +BOOL CALLBACK GetMonitorByIndex(HMONITOR hMonitor, HDC hdcMonitor, LPRECT lprcMonitor, RECT* rc) +{ + //printf(">> %d %d %d %d\n", lprcMonitor->left, lprcMonitor->top, lprcMonitor->right, lprcMonitor->bottom); + if (--rc->left < 0) + { + *rc = *lprcMonitor; + return FALSE; + } + return TRUE; +} + +HMONITOR explorer_MonitorFromRect(LPCRECT lprc, DWORD dwFlags) +{ + /*printf("%d %d %d %d\n", lprc->left, lprc->top, lprc->right, lprc->bottom); + + return MonitorFromRect(lprc, dwFlags); + //}*/ + if (bTaskbarMonitorOverride) + { + RECT rc; + ZeroMemory(&rc, sizeof(RECT)); + rc.left = bTaskbarMonitorOverride - 1; + EnumDisplayMonitors( + NULL, + NULL, + GetMonitorByIndex, + &rc + ); + if (rc.top != rc.bottom) + { + return MonitorFromRect(&rc, dwFlags); + } + } + return MonitorFromRect(lprc, dwFlags); +} + HRESULT (*explorer_SHCreateStreamOnModuleResourceWFunc)( HMODULE hModule, LPCWSTR pwszName, @@ -3854,6 +3891,7 @@ __declspec(dllexport) DWORD WINAPI main( if (bOldTaskbar) { VnPatchIAT(hExplorer, "api-ms-win-core-libraryloader-l1-2-0.dll", "GetProcAddress", explorer_GetProcAddressHook); + VnPatchIAT(hExplorer, "user32.dll", "MonitorFromRect", explorer_MonitorFromRect); } VnPatchIAT(hExplorer, "user32.dll", "TrackPopupMenuEx", explorer_TrackPopupMenuExHook); if (bClassicThemeMitigations)