From d5ecd858b2006a329c9939554daba290be955c79 Mon Sep 17 00:00:00 2001 From: Valentin Radu Date: Thu, 21 Oct 2021 12:51:43 +0300 Subject: [PATCH] Added clock flyout options --- ExplorerPatcher/ExplorerPatcher.rc | 8 +- ExplorerPatcher/dllmain.c | 205 ++++++++++++++++------------- ExplorerPatcher/settings.reg | 5 +- 3 files changed, 121 insertions(+), 97 deletions(-) diff --git a/ExplorerPatcher/ExplorerPatcher.rc b/ExplorerPatcher/ExplorerPatcher.rc index 6f2088d..650dc98 100644 --- a/ExplorerPatcher/ExplorerPatcher.rc +++ b/ExplorerPatcher/ExplorerPatcher.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 22000,258,31,0 - PRODUCTVERSION 22000,258,31,0 + FILEVERSION 22000,258,31,1 + PRODUCTVERSION 22000,258,31,1 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "VALINET Solutions SRL" VALUE "FileDescription", "ExplorerPatcher" - VALUE "FileVersion", "22000.258.31.0" + VALUE "FileVersion", "22000.258.31.1" VALUE "InternalName", "ExplorerPatcher.dll" VALUE "LegalCopyright", "Copyright (C) 2006-2021 VALINET Solutions SRL. All rights reserved." VALUE "OriginalFilename", "ExplorerPatcher.dll" VALUE "ProductName", "ExplorerPatcher" - VALUE "ProductVersion", "22000.258.31.0" + VALUE "ProductVersion", "22000.258.31.1" END END BLOCK "VarFileInfo" diff --git a/ExplorerPatcher/dllmain.c b/ExplorerPatcher/dllmain.c index 89e5ba4..3ea4ca2 100644 --- a/ExplorerPatcher/dllmain.c +++ b/ExplorerPatcher/dllmain.c @@ -275,6 +275,97 @@ void LaunchNetworkTargets(DWORD dwTarget) #pragma endregion +#pragma region "Toggle shell features" +BOOL CALLBACK ToggleImmersiveCallback(HWND hWnd, LPARAM lParam) +{ + WORD ClassWord; + + ClassWord = GetClassWord(hWnd, GCW_ATOM); + if (ClassWord == RegisterWindowMessageW(L"WorkerW")) + { + PostMessageW(hWnd, WM_HOTKEY, lParam, 0); + } + + return TRUE; +} + +void ToggleHelp() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 505, 0); +} + +void ToggleRunDialog() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 502, MAKELPARAM(MOD_WIN, 0x52)); +} + +void ToggleSystemProperties() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 512, 0); +} + +void FocusSystray() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 514, 0); +} + +void TriggerAeroShake() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 515, 0); +} + +void PeekDesktop() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 516, 0); +} + +void ToggleEmojiPanel() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 579, 0); +} + +void ShowDictationPanel() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 577, 0); +} + +void ToggleClipboardViewer() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 578, 0); +} + +void ToggleSearch() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 507, MAKELPARAM(MOD_WIN, 0x53)); +} + +void ToggleTaskView() +{ + EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 11); +} + +void ToggleWidgetsPanel() +{ + EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x66); +} + +void ToggleMainClockFlyout() +{ + EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x6B); +} + +void ToggleNotificationsFlyout() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 591, 0); +} + +void ToggleActionCenter() +{ + PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 500, MAKELPARAM(MOD_WIN, 0x41)); +} +#pragma endregion + + #pragma region "twinui.pcshell.dll hooks" #ifdef _WIN64 #define LAUNCHERTIP_CLASS_NAME L"LauncherTipWnd" @@ -859,17 +950,21 @@ interface Win32Clock { CONST_VTBL struct Win32ClockVtbl* lpVtbl; }; -BOOL ShouldShowLegacyClockExperience() +DWORD ShouldShowLegacyClockExperience() { DWORD dwVal = 0, dwSize = sizeof(DWORD); - return (SHRegGetValueFromHKCUHKLMFunc && SHRegGetValueFromHKCUHKLMFunc( + if (SHRegGetValueFromHKCUHKLMFunc && SHRegGetValueFromHKCUHKLMFunc( TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\ImmersiveShell"), TEXT("UseWin32TrayClockExperience"), SRRF_RT_REG_DWORD, NULL, &dwVal, (LPDWORD)(&dwSize) - ) == ERROR_SUCCESS && dwVal); + ) == ERROR_SUCCESS) + { + return dwVal; + } + return 0; } BOOL ShowLegacyClockExpierience(HWND hWnd) { @@ -911,7 +1006,7 @@ INT64 ClockButtonSubclassProc( } else if (uMsg == WM_LBUTTONDOWN || (uMsg == WM_KEYDOWN && wParam == VK_RETURN)) { - if (ShouldShowLegacyClockExperience()) + if (ShouldShowLegacyClockExperience() == 1) { if (!FindWindowW(L"ClockFlyoutWindow", NULL)) { @@ -922,6 +1017,14 @@ INT64 ClockButtonSubclassProc( return 1; } } + else if (ShouldShowLegacyClockExperience() == 2) + { + if (FindWindowW(L"Windows.UI.Core.CoreWindow", NULL)) + { + ToggleNotificationsFlyout(); + } + return 1; + } } return DefSubclassProc(hWnd, uMsg, wParam, lParam); } @@ -1546,93 +1649,6 @@ HWND WINAPI explorerframe_SHCreateWorkerWindowHook( } #pragma endregion - -#pragma region "Toggle shell features" -BOOL CALLBACK ToggleImmersiveCallback(HWND hWnd, LPARAM lParam) -{ - WORD ClassWord; - - ClassWord = GetClassWord(hWnd, GCW_ATOM); - if (ClassWord == RegisterWindowMessageW(L"WorkerW")) - { - PostMessageW(hWnd, WM_HOTKEY, lParam, 0); - } - - return TRUE; -} - -void ToggleHelp() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 505, 0); -} - -void ToggleRunDialog() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 502, MAKELPARAM(MOD_WIN, 0x52)); -} - -void ToggleSystemProperties() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 512, 0); -} - -void FocusSystray() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 514, 0); -} - -void TriggerAeroShake() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 515, 0); -} - -void PeekDesktop() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 516, 0); -} - -void ToggleEmojiPanel() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 579, 0); -} - -void ShowDictationPanel() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 577, 0); -} - -void ToggleClipboardViewer() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 578, 0); -} - -void ToggleSearch() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 507, MAKELPARAM(MOD_WIN, 0x53)); -} - -void ToggleTaskView() -{ - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 11); -} - -void ToggleWidgetsPanel() -{ - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x66); -} - -void ToggleMainClockFlyout() -{ - EnumThreadWindows(GetWindowThreadProcessId(FindWindowExW(NULL, NULL, L"ApplicationManager_ImmersiveShellWindow", NULL), NULL), ToggleImmersiveCallback, 0x6B); -} - -void ToggleActionCenter() -{ - PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 500, MAKELPARAM(MOD_WIN, 0x41)); -} -#pragma endregion - - #pragma region "Show WiFi networks on network icon click" #ifdef _WIN64 DEFINE_GUID(GUID_c2f03a33_21f5_47fa_b4bb_156362a2f239, @@ -1744,7 +1760,7 @@ INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHo const unsigned int WM_TOGGLE_CLOCK_FLYOUT = 1486; if (hWnd == hShellTray_Wnd) { - if (ShouldShowLegacyClockExperience()) + if (ShouldShowLegacyClockExperience() == 1) { if (!FindWindowW(L"ClockFlyoutWindow", NULL)) { @@ -1755,6 +1771,11 @@ INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHo return PostMessageW(FindWindowW(L"ClockFlyoutWindow", NULL), WM_CLOSE, 0, 0); } } + else if (ShouldShowLegacyClockExperience() == 2) + { + ToggleNotificationsFlyout(); + return 0; + } // On the main monitor, the TrayUI component of CTray handles this // message and basically does a `ClockButton::ToggleFlyout`; that's // the only place in code where that is used, otherwise, clicking and diff --git a/ExplorerPatcher/settings.reg b/ExplorerPatcher/settings.reg index fa15b7c..1e9a7ce 100644 --- a/ExplorerPatcher/settings.reg +++ b/ExplorerPatcher/settings.reg @@ -66,7 +66,10 @@ ;i Use legacy volume flyout "EnableMtcUvc"=dword:00000001 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ImmersiveShell] -;b Use legacy clock flyout +;c 3 Clock flyout style +;x 2 Windows 11 +;x 0 Windows 10 (default) +;x 1 Windows 7 "UseWin32TrayClockExperience"=dword:00000000 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\ExplorerPatcher] ;a Choosing 'Open Network && Internet settings' when right clicking the