diff --git a/ExplorerPatcher-L10N b/ExplorerPatcher-L10N index 0fbda72e3..25b9ac643 160000 --- a/ExplorerPatcher-L10N +++ b/ExplorerPatcher-L10N @@ -1 +1 @@ -Subproject commit 0fbda72e30fe4b7cdb25f325a7943469c1b483f9 +Subproject commit 25b9ac6431efa6cea5461f41eae0376eb2642e26 diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index f167e3f60..9900c6558 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -2525,61 +2525,97 @@ INT64 Shell_TrayWndSubclassProc( DWORD_PTR bIsPrimaryTaskbar ) { - if (uMsg == WM_NCDESTROY) + switch (uMsg) { - if (bIsPrimaryTaskbar) + case WM_NCDESTROY: { - UnhookWindowsHookEx(Shell_TrayWndMouseHook); + if (bIsPrimaryTaskbar) + { + UnhookWindowsHookEx(Shell_TrayWndMouseHook); + } + RemoveWindowSubclass(hWnd, Shell_TrayWndSubclassProc, Shell_TrayWndSubclassProc); + break; } - RemoveWindowSubclass(hWnd, Shell_TrayWndSubclassProc, Shell_TrayWndSubclassProc); - } - else if (bOldTaskbar && !bIsPrimaryTaskbar && TaskbarCenter_ShouldCenter(dwMMOldTaskbarAl) && TaskbarCenter_ShouldStartBeCentered(dwMMOldTaskbarAl) && (uMsg == WM_NCLBUTTONDOWN || uMsg == WM_NCRBUTTONUP) && HandleTaskbarCornerInteraction(hWnd, uMsg, wParam, lParam)) - { - return 0; - } - else if (!bIsPrimaryTaskbar && uMsg == WM_CONTEXTMENU) - { - // Received some times when right clicking a secondary taskbar button, and it would - // show the classic taskbar context menu but containing only "Show desktop" instead - // of ours or a button's jump list, so we cancel it and that seems to properly invoke - // the right menu - return 0; - } - else if (!bOldTaskbar && !bIsPrimaryTaskbar && uMsg == WM_SETCURSOR) - { - // Received when mouse is over taskbar edge and autohide is on - PostMessageW(hWnd, WM_ACTIVATE, WA_ACTIVE, NULL); - } - else if (bOldTaskbar && uMsg == WM_LBUTTONDBLCLK && bTaskbarAutohideOnDoubleClick) - { - ToggleTaskbarAutohide(); - return 0; - } - else if (uMsg == WM_HOTKEY && wParam == 500 && lParam == MAKELPARAM(MOD_WIN, 0x41) && IsWindows11()) - { - InvokeActionCenter(); - return 0; - /*if (lpShouldDisplayCCButton) + case WM_NCLBUTTONDOWN: + case WM_NCRBUTTONUP: { - *lpShouldDisplayCCButton = 1; + if (bOldTaskbar && !bIsPrimaryTaskbar && TaskbarCenter_ShouldCenter(dwMMOldTaskbarAl) && TaskbarCenter_ShouldStartBeCentered(dwMMOldTaskbarAl) && HandleTaskbarCornerInteraction(hWnd, uMsg, wParam, lParam)) + return 0; + break; } - LRESULT lRes = DefSubclassProc(hWnd, uMsg, wParam, lParam); - if (lpShouldDisplayCCButton) + case WM_CONTEXTMENU: + { + if (!bIsPrimaryTaskbar) + { + // Received some times when right clicking a secondary taskbar button, and it would + // show the classic taskbar context menu but containing only "Show desktop" instead + // of ours or a button's jump list, so we cancel it and that seems to properly invoke + // the right menu + return 0; + } + break; + } + case WM_SETCURSOR: { - *lpShouldDisplayCCButton = bHideControlCenterButton; + if (!bOldTaskbar && !bIsPrimaryTaskbar) + { + // Received when mouse is over taskbar edge and autohide is on + PostMessageW(hWnd, WM_ACTIVATE, WA_ACTIVE, NULL); + } + break; + } + case WM_LBUTTONDBLCLK: + { + if (bOldTaskbar && bTaskbarAutohideOnDoubleClick) + { + ToggleTaskbarAutohide(); + return 0; + } + break; + } + case WM_HOTKEY: + { + if (wParam == 500 && lParam == MAKELPARAM(MOD_WIN, 'A') && global_rovi.dwBuildNumber >= 25921 && bOldTaskbar == 1) + { + InvokeActionCenter(); + return 0; + } + break; + } + case WM_DISPLAYCHANGE: + { + if (bIsPrimaryTaskbar) + { + UpdateStartMenuPositioning(MAKELPARAM(TRUE, FALSE)); + } + break; + } + /*case WM_PARENTNOTIFY: + { + if (!bOldTaskbar && wParam == WM_RBUTTONDOWN && !Shell_TrayWndMouseHook) // && !IsUndockingDisabled + { + DWORD dwThreadId = GetCurrentThreadId(); + Shell_TrayWndMouseHook = SetWindowsHookExW(WH_MOUSE, Shell_TrayWndMouseProc, NULL, dwThreadId); + } + break; + }*/ + case WM_SETTINGCHANGE: + { + if (IsWindows11Version22H2OrHigher() && (*((WORD*)&(lParam)+1)) && !wcscmp(lParam, L"EnsureXAML")) + { + EnsureXAML(); + return 0; + } + break; + } + case 0x558: + { + g_bIsDesktopRaised = (lParam & 1) == 0; + break; } - return lRes;*/ - } - else if (bIsPrimaryTaskbar && uMsg == WM_DISPLAYCHANGE) - { - UpdateStartMenuPositioning(MAKELPARAM(TRUE, FALSE)); } - //else if (!bOldTaskbar && uMsg == WM_PARENTNOTIFY && wParam == WM_RBUTTONDOWN && !Shell_TrayWndMouseHook) // && !IsUndockingDisabled - //{ - // DWORD dwThreadId = GetCurrentThreadId(); - // Shell_TrayWndMouseHook = SetWindowsHookExW(WH_MOUSE, Shell_TrayWndMouseProc, NULL, dwThreadId); - //} - else if (uMsg == RegisterWindowMessageW(L"Windows11ContextMenu_" _T(EP_CLSID))) + + if (uMsg >= 0xC000 && uMsg <= 0xFFFF && uMsg == RegisterWindowMessageW(L"Windows11ContextMenu_" _T(EP_CLSID))) { POINT pt; pt.x = GET_X_LPARAM(lParam); @@ -2726,15 +2762,7 @@ INT64 Shell_TrayWndSubclassProc( DestroyMenu(hMenu); } } - else if (uMsg == 1368) - { - g_bIsDesktopRaised = (lParam & 1) == 0; - } - else if (uMsg == WM_SETTINGCHANGE && IsWindows11Version22H2OrHigher() && (*((WORD*)&(lParam)+1)) && !wcscmp(lParam, L"EnsureXAML")) - { - EnsureXAML(); - return 0; - } + return DefSubclassProc(hWnd, uMsg, wParam, lParam); } #endif @@ -10130,7 +10158,9 @@ int RtlQueryFeatureConfigurationHook(UINT32 featureId, int sectionType, INT64* c { if (bOldTaskbar) { - // Fixes start menu positioning when the taskbar is at the left or right side + // This feature flag when enabled makes the flyouts disregard the left and right offsets, so that they + // appear over the Copilot sidebar instead of beside it. Disabling this fixes start menu positioning + // when the taskbar is at the left or right side, but it produce that aforementioned behavior. buffer->enabledState = FEATURE_ENABLED_STATE_DISABLED; } break; @@ -10548,7 +10578,7 @@ BOOL Moment2PatchToastCenter(LPMODULEINFO mi) // // Pattern 2: // Will have a match if CToastCenterExperienceManager::ShouldShowWithinWorkArea() is inlined. - // ```0F 10 45 ?? ?? 0F 7F 44 24 ?? 44 // movups - movdqu - cmp``` + // ```0F 10 45 ?? ?? 0F 7F 44 24 ?? 44 38 // movups - movdqu - cmp``` // 25951.1000: 36B2C4 // // Pattern 3: @@ -10558,20 +10588,20 @@ BOOL Moment2PatchToastCenter(LPMODULEINFO mi) // // Pattern 4: // Same as pattern 2, but different length of the movdqu instruction. - // ```0F 10 45 ?? ?? 0F 7F 45 ?? 44 // movups - movdqu - cmp``` + // ```0F 10 45 ?? ?? 0F 7F 45 ?? 44 38 // movups - movdqu - cmp``` // No matches yet, just in case. int assignmentSize = 10; PBYTE rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x44\x24\x00\x48\x8B\xCF", "xxx??xxxx?xxx"); if (!rcMonitorAssignment) { - rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x44\x24\x00\x44", "xxx??xxxx?x"); + rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x44\x24\x00\x44\x38", "xxx??xxxx?xx"); if (!rcMonitorAssignment) { assignmentSize = 9; rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x45\x00\x48\x8B\xCF", "xxx??xxx?xxx"); if (!rcMonitorAssignment) { - rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x45\x00\x44", "xxx??xxx?x"); + rcMonitorAssignment = FindPattern(mi->lpBaseOfDll, mi->SizeOfImage, "\x0F\x10\x45\x00\x00\x0F\x7F\x45\x00\x44\x38", "xxx??xxx?xx"); if (!rcMonitorAssignment) return FALSE; } } @@ -11865,22 +11895,9 @@ BOOL CrashCounterHandleEntryPoint() #pragma region "Loader for alternate taskbar implementation" #ifdef _WIN64 -void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS) +BOOL CheckExplorerSymbols(symbols_addr* symbols_PTRS) { - if (!IsWindows11Version22H2OrHigher()) - return; // Definitely unsupported - - if (bOldTaskbar <= 1) - return; // Not enabled - - const WCHAR* pszTaskbarDll = PickTaskbarDll(); - if (!pszTaskbarDll) - { - wprintf(L"[TB] Unsupported build\n"); - return; - } - - bool bAllValid = true; + BOOL bAllValid = TRUE; for (SIZE_T j = 0; j < ARRAYSIZE(symbols_PTRS->explorer_PTRS); ++j) { DWORD i = symbols_PTRS->explorer_PTRS[j]; @@ -11888,10 +11905,33 @@ void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS) if (!bAllValid) break; } + return bAllValid; +} - if (!bAllValid) +const WCHAR* GetTaskbarDllChecked(symbols_addr* symbols_PTRS) +{ + if (bOldTaskbar < 2 || !IsWindows11Version22H2OrHigher()) + { + return NULL; + } + const WCHAR* pszTaskbarDll = PickTaskbarDll(); + if (!pszTaskbarDll) + { + wprintf(L"[TB] Unsupported build\n"); + return NULL; + } + if (!CheckExplorerSymbols(symbols_PTRS)) { wprintf(L"[TB] Missing offsets\n"); + return NULL; + } + return pszTaskbarDll; +} + +void PrepareAlternateTaskbarImplementation(symbols_addr* symbols_PTRS, const WCHAR* pszTaskbarDll) +{ + if (!symbols_PTRS || !pszTaskbarDll) + { return; } @@ -12345,6 +12385,12 @@ DWORD Inject(BOOL bIsExplorer) } } + const WCHAR* pszTaskbarDll = GetTaskbarDllChecked(&symbols_PTRS); + if (bOldTaskbar >= 2 && !pszTaskbarDll) + { + bOldTaskbar = 1; + } + HANDLE hUser32 = LoadLibraryW(L"user32.dll"); CreateWindowInBand = GetProcAddress(hUser32, "CreateWindowInBand"); @@ -12685,7 +12731,7 @@ DWORD Inject(BOOL bIsExplorer) #endif VnPatchIAT(hTwinuiPcshell, "API-MS-WIN-CORE-REGISTRY-L1-1-0.DLL", "RegGetValueW", twinuipcshell_RegGetValueW); - PrepareAlternateTaskbarImplementation(&symbols_PTRS); + PrepareAlternateTaskbarImplementation(&symbols_PTRS, pszTaskbarDll); printf("Setup twinui.pcshell functions done\n"); diff --git a/ExplorerPatcher/utility.h b/ExplorerPatcher/utility.h index e656c7aa6..de7843e40 100644 --- a/ExplorerPatcher/utility.h +++ b/ExplorerPatcher/utility.h @@ -703,16 +703,21 @@ inline const WCHAR* PickTaskbarDll() return L"ep_taskbar.2.dll"; } - if (b >= 25201 && b <= 25915) // Pre-reboot Dev channel until early Canary channel + if (b >= 25201 && b <= 25915) // Pre-reboot Dev channel until early Canary channel, nuked ITrayComponentHost methods related to classic search box { return L"ep_taskbar.3.dll"; } - if (b >= 25921) // Canary channel with nuked classic system tray + if (b >= 25921 && b <= 26040) // Canary channel with nuked classic system tray { return L"ep_taskbar.4.dll"; } + if (b >= 26052) // Same as 4 but with 2 new methods in ITrayComponentHost between GetTrayUI and ProgrammableTaskbarReportClick + { + return L"ep_taskbar.5.dll"; + } + return NULL; } diff --git a/ep_setup/ep_setup.c b/ep_setup/ep_setup.c index c4a6cb583..019ec1b1c 100644 --- a/ep_setup/ep_setup.c +++ b/ep_setup/ep_setup.c @@ -440,6 +440,17 @@ BOOL DownloadResource(BOOL bInstall, LPCWSTR pwszURL, DWORD dwSize, LPCSTR chash return bOk; } +BOOL ProcessTaskbarDlls(BOOL bInstall, HINSTANCE hInstance, WCHAR wszPath[260], BOOL bExtractMode) +{ + BOOL bOk = TRUE; + LPCWSTR pwszTaskbarDllName = bExtractMode ? NULL : PickTaskbarDll(); + if (bOk) bOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.2.dll")), hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll"); + if (bOk) bOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.3.dll")), hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll"); + if (bOk) bOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.4.dll")), hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll"); + if (bOk) bOk = InstallResource(bInstall && (bExtractMode || pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.5.dll")), hInstance, IDR_EP_TASKBAR_5, wszPath, L"ep_taskbar.5.dll"); + return bOk; +} + int WINAPI wWinMain( _In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, @@ -481,10 +492,8 @@ int WINAPI wWinMain( if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath, L"WebView2Loader.dll"); if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_STARTMENU, wszPath, L"wincorlib.dll"); if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_GUI, wszPath, L"ep_gui.dll"); - if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll"); - if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll"); - if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll"); - return 0; + if (bOk) bOk = ProcessTaskbarDlls(bInstall, hInstance, wszPath, TRUE); + return !bOk; } WCHAR wszOwnPath[MAX_PATH]; @@ -823,10 +832,7 @@ int WINAPI wWinMain( if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_EP_WEATHER_STUB, wszPath, L"ep_weather_host_stub.dll"); if (bOk) bOk = InstallResource(bInstall, hInstance, IDR_MS_WEBVIEW2_LOADER, wszPath, L"WebView2Loader.dll"); } - LPCWSTR pwszTaskbarDllName = PickTaskbarDll(); - if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.2.dll"), hInstance, IDR_EP_TASKBAR_2, wszPath, L"ep_taskbar.2.dll"); - if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.3.dll"), hInstance, IDR_EP_TASKBAR_3, wszPath, L"ep_taskbar.3.dll"); - if (bOk) bOk = InstallResource(bInstall && pwszTaskbarDllName && !wcscmp(pwszTaskbarDllName, L"ep_taskbar.4.dll"), hInstance, IDR_EP_TASKBAR_4, wszPath, L"ep_taskbar.4.dll"); + if (bOk) bOk = ProcessTaskbarDlls(bInstall, hInstance, wszPath, FALSE); // -------------------------------------------------------------------------------- diff --git a/ep_setup/ep_setup.vcxproj b/ep_setup/ep_setup.vcxproj index f5de466d4..a296fa898 100644 --- a/ep_setup/ep_setup.vcxproj +++ b/ep_setup/ep_setup.vcxproj @@ -165,6 +165,11 @@ EP_TASKBAR_4_EXISTS;%(PreprocessorDefinitions) + + + EP_TASKBAR_5_EXISTS;%(PreprocessorDefinitions) + + diff --git a/ep_setup/resources/ep_setup.rc b/ep_setup/resources/ep_setup.rc index 721bb2622..c8261ed2d 100644 --- a/ep_setup/resources/ep_setup.rc +++ b/ep_setup/resources/ep_setup.rc @@ -118,6 +118,10 @@ IDR_EP_TASKBAR_3 RCDATA "..\\build\\Release\\ep_taskbar.3.dll IDR_EP_TASKBAR_4 RCDATA "..\\build\\Release\\ep_taskbar.4.dll" #endif +#if EP_TASKBAR_5_EXISTS +IDR_EP_TASKBAR_5 RCDATA "..\\build\\Release\\ep_taskbar.5.dll" +#endif + #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/ep_setup/resources/resource.h b/ep_setup/resources/resource.h index 5102e2cbb..4c149b272 100644 --- a/ep_setup/resources/resource.h +++ b/ep_setup/resources/resource.h @@ -13,6 +13,7 @@ #define IDR_EP_TASKBAR_2 110 #define IDR_EP_TASKBAR_3 111 #define IDR_EP_TASKBAR_4 112 +#define IDR_EP_TASKBAR_5 113 #define IDS_SETUP_UNINSTALL_PROMPT 301 #define IDS_SETUP_INSTALL_LOGOFF 302