From 65167d91ff632f8defcde31939d90f391e43c155 Mon Sep 17 00:00:00 2001 From: Michael Maltsev <4129781+m417z@users.noreply.github.com> Date: Sat, 8 Feb 2025 23:12:29 +0200 Subject: [PATCH] Start button always on the left v.1.2.1 (#1500) * Improved start menu positioning. * Fixed the start menu width option not applying until restart in some cases. --- mods/taskbar-start-button-position.wh.cpp | 566 ++++++++-------------- 1 file changed, 211 insertions(+), 355 deletions(-) diff --git a/mods/taskbar-start-button-position.wh.cpp b/mods/taskbar-start-button-position.wh.cpp index 33e7f1c82..7cce5ace2 100644 --- a/mods/taskbar-start-button-position.wh.cpp +++ b/mods/taskbar-start-button-position.wh.cpp @@ -2,16 +2,14 @@ // @id taskbar-start-button-position // @name Start button always on the left // @description Forces the start button to be on the left of the taskbar, even when taskbar icons are centered (Windows 11 only) -// @version 1.2 +// @version 1.2.1 // @author m417z // @github https://github.com/m417z // @twitter https://twitter.com/m417z // @homepage https://m417z.com/ // @include explorer.exe -// @include StartMenuExperienceHost.exe -// @include SearchHost.exe // @architecture x86-64 -// @compilerOptions -lole32 -loleaut32 -lruntimeobject -lshcore +// @compilerOptions -ldwmapi -lole32 -loleaut32 -lruntimeobject -lshcore // ==/WindhawkMod== // Source code is published under The GNU General Public License v3.0. @@ -53,6 +51,8 @@ Only Windows 11 is supported. #include +#include + #undef GetCurrentTime #include @@ -69,16 +69,13 @@ struct { int startMenuWidth; } g_settings; -enum class Target { - Explorer, - StartMenu, - SearchHost, -}; - -Target g_target; - std::atomic g_unloading; +HWND g_startMenuWnd; +int g_startMenuOriginalWidth; +HWND g_searchMenuWnd; +int g_searchMenuOriginalX; + typedef enum MONITOR_DPI_TYPE { MDT_EFFECTIVE_DPI = 0, MDT_ANGULAR_DPI = 1, @@ -91,16 +88,12 @@ STDAPI GetDpiForMonitor(HMONITOR hmonitor, UINT* dpiY); HWND GetTaskbarWnd() { - static HWND hTaskbarWnd; + HWND hTaskbarWnd = FindWindow(L"Shell_TrayWnd", nullptr); - if (!hTaskbarWnd) { - HWND hWnd = FindWindow(L"Shell_TrayWnd", nullptr); - - DWORD processId = 0; - if (hWnd && GetWindowThreadProcessId(hWnd, &processId) && - processId == GetCurrentProcessId()) { - hTaskbarWnd = hWnd; - } + DWORD processId = 0; + if (!hTaskbarWnd || !GetWindowThreadProcessId(hTaskbarWnd, &processId) || + processId != GetCurrentProcessId()) { + return nullptr; } return hTaskbarWnd; @@ -210,17 +203,17 @@ void* CTaskBand_ITaskListWndSite_vftable; void* CSecondaryTaskBand_ITaskListWndSite_vftable; -using CTaskBand_GetTaskbarHost_t = PVOID(WINAPI*)(PVOID pThis, PVOID* result); +using CTaskBand_GetTaskbarHost_t = void*(WINAPI*)(void* pThis, void** result); CTaskBand_GetTaskbarHost_t CTaskBand_GetTaskbarHost_Original; -using CSecondaryTaskBand_GetTaskbarHost_t = PVOID(WINAPI*)(PVOID pThis, - PVOID* result); +using CSecondaryTaskBand_GetTaskbarHost_t = void*(WINAPI*)(void* pThis, + void** result); CSecondaryTaskBand_GetTaskbarHost_t CSecondaryTaskBand_GetTaskbarHost_Original; -using std__Ref_count_base__Decref_t = void(WINAPI*)(PVOID pThis); +using std__Ref_count_base__Decref_t = void(WINAPI*)(void* pThis); std__Ref_count_base__Decref_t std__Ref_count_base__Decref_Original; -XamlRoot XamlRootFromTaskbarHostSharedPtr(PVOID taskbarHostSharedPtr[2]) { +XamlRoot XamlRootFromTaskbarHostSharedPtr(void* taskbarHostSharedPtr[2]) { if (!taskbarHostSharedPtr[0] && !taskbarHostSharedPtr[1]) { return nullptr; } @@ -249,14 +242,19 @@ XamlRoot GetTaskbarXamlRoot(HWND hTaskbarWnd) { return nullptr; } - PVOID taskBand = (PVOID)GetWindowLongPtr(hTaskSwWnd, 0); - PVOID taskBandForTaskListWndSite = taskBand; - while (*(PVOID*)taskBandForTaskListWndSite != - CTaskBand_ITaskListWndSite_vftable) { - taskBandForTaskListWndSite = (PVOID*)taskBandForTaskListWndSite + 1; + void* taskBand = (void*)GetWindowLongPtr(hTaskSwWnd, 0); + void* taskBandForTaskListWndSite = taskBand; + for (int i = 0; *(void**)taskBandForTaskListWndSite != + CTaskBand_ITaskListWndSite_vftable; + i++) { + if (i == 20) { + return nullptr; + } + + taskBandForTaskListWndSite = (void**)taskBandForTaskListWndSite + 1; } - PVOID taskbarHostSharedPtr[2]{}; + void* taskbarHostSharedPtr[2]{}; CTaskBand_GetTaskbarHost_Original(taskBandForTaskListWndSite, taskbarHostSharedPtr); @@ -270,31 +268,36 @@ XamlRoot GetSecondaryTaskbarXamlRoot(HWND hSecondaryTaskbarWnd) { return nullptr; } - PVOID taskBand = (PVOID)GetWindowLongPtr(hTaskSwWnd, 0); - PVOID taskBandForTaskListWndSite = taskBand; - while (*(PVOID*)taskBandForTaskListWndSite != - CSecondaryTaskBand_ITaskListWndSite_vftable) { - taskBandForTaskListWndSite = (PVOID*)taskBandForTaskListWndSite + 1; + void* taskBand = (void*)GetWindowLongPtr(hTaskSwWnd, 0); + void* taskBandForTaskListWndSite = taskBand; + for (int i = 0; *(void**)taskBandForTaskListWndSite != + CSecondaryTaskBand_ITaskListWndSite_vftable; + i++) { + if (i == 20) { + return nullptr; + } + + taskBandForTaskListWndSite = (void**)taskBandForTaskListWndSite + 1; } - PVOID taskbarHostSharedPtr[2]{}; + void* taskbarHostSharedPtr[2]{}; CSecondaryTaskBand_GetTaskbarHost_Original(taskBandForTaskListWndSite, taskbarHostSharedPtr); return XamlRootFromTaskbarHostSharedPtr(taskbarHostSharedPtr); } -using RunFromWindowThreadProc_t = void(WINAPI*)(PVOID parameter); +using RunFromWindowThreadProc_t = void(WINAPI*)(void* parameter); bool RunFromWindowThread(HWND hWnd, RunFromWindowThreadProc_t proc, - PVOID procParam) { + void* procParam) { static const UINT runFromWindowThreadRegisteredMsg = RegisterWindowMessage(L"Windhawk_RunFromWindowThread_" WH_MOD_ID); struct RUN_FROM_WINDOW_THREAD_PARAM { RunFromWindowThreadProc_t proc; - PVOID procParam; + void* procParam; }; DWORD dwThreadId = GetWindowThreadProcessId(hWnd, nullptr); @@ -309,7 +312,7 @@ bool RunFromWindowThread(HWND hWnd, HHOOK hook = SetWindowsHookEx( WH_CALLWNDPROC, - [](int nCode, WPARAM wParam, LPARAM lParam) WINAPI -> LRESULT { + [](int nCode, WPARAM wParam, LPARAM lParam) -> LRESULT { if (nCode == HC_ACTION) { const CWPSTRUCT* cwp = (const CWPSTRUCT*)lParam; if (cwp->message == runFromWindowThreadRegisteredMsg) { @@ -341,7 +344,7 @@ void ApplySettingsFromTaskbarThread() { EnumThreadWindows( GetCurrentThreadId(), - [](HWND hWnd, LPARAM lParam) WINAPI -> BOOL { + [](HWND hWnd, LPARAM lParam) -> BOOL { WCHAR szClassName[32]; if (GetClassName(hWnd, szClassName, ARRAYSIZE(szClassName)) == 0) { return TRUE; @@ -373,25 +376,27 @@ void ApplySettingsFromTaskbarThread() { void ApplySettings(HWND hTaskbarWnd) { RunFromWindowThread( - hTaskbarWnd, - [](PVOID pParam) WINAPI { ApplySettingsFromTaskbarThread(); }, 0); + hTaskbarWnd, [](void* pParam) { ApplySettingsFromTaskbarThread(); }, 0); } -using IUIElement_Arrange_t = HRESULT( - WINAPI*)(UIElement pThis, const winrt::Windows::Foundation::Rect* rect); +using IUIElement_Arrange_t = + HRESULT(WINAPI*)(void* pThis, const winrt::Windows::Foundation::Rect* rect); IUIElement_Arrange_t IUIElement_Arrange_Original; HRESULT WINAPI -IUIElement_Arrange_Hook(UIElement pThis, +IUIElement_Arrange_Hook(void* pThis, const winrt::Windows::Foundation::Rect* rect) { Wh_Log(L">"); - auto original = [&] { return IUIElement_Arrange_Original(pThis, rect); }; + auto original = [=] { return IUIElement_Arrange_Original(pThis, rect); }; if (g_unloading) { return original(); } - FrameworkElement element = pThis.try_as(); + FrameworkElement element = nullptr; + (*(IUnknown**)pThis) + ->QueryInterface(winrt::guid_of(), + winrt::put_abi(element)); if (!element) { return original(); } @@ -573,272 +578,157 @@ bool HookTaskbarViewDllSymbols() { return HookSymbols(module, symbolHooks, ARRAYSIZE(symbolHooks)); } -namespace CoreWindowUI { +std::wstring GetProcessFileName(DWORD dwProcessId) { + HANDLE hProcess = + OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId); + if (!hProcess) { + return std::wstring{}; + } -using SetWindowPos_t = decltype(&SetWindowPos); -SetWindowPos_t SetWindowPos_Original; + WCHAR processPath[MAX_PATH]; -bool IsTargetCoreWindow(HWND hWnd) { - DWORD threadId = 0; - DWORD processId = 0; - if (!hWnd || !(threadId = GetWindowThreadProcessId(hWnd, &processId)) || - processId != GetCurrentProcessId()) { - return false; + DWORD dwSize = ARRAYSIZE(processPath); + if (!QueryFullProcessImageName(hProcess, 0, processPath, &dwSize)) { + CloseHandle(hProcess); + return std::wstring{}; } - WCHAR szClassName[32]; - if (GetClassName(hWnd, szClassName, ARRAYSIZE(szClassName)) == 0) { - return false; - } + CloseHandle(hProcess); - if (_wcsicmp(szClassName, L"Windows.UI.Core.CoreWindow") != 0) { - return false; + PCWSTR processFileNameUpper = wcsrchr(processPath, L'\\'); + if (!processFileNameUpper) { + return std::wstring{}; } - return true; + processFileNameUpper++; + return processFileNameUpper; } -std::vector GetCoreWindows() { - struct ENUM_WINDOWS_PARAM { - std::vector* hWnds; +using DwmSetWindowAttribute_t = decltype(&DwmSetWindowAttribute); +DwmSetWindowAttribute_t DwmSetWindowAttribute_Original; +HRESULT WINAPI DwmSetWindowAttribute_Hook(HWND hwnd, + DWORD dwAttribute, + LPCVOID pvAttribute, + DWORD cbAttribute) { + auto original = [=]() { + return DwmSetWindowAttribute_Original(hwnd, dwAttribute, pvAttribute, + cbAttribute); }; - std::vector hWnds; - ENUM_WINDOWS_PARAM param = {&hWnds}; - EnumWindows( - [](HWND hWnd, LPARAM lParam) WINAPI -> BOOL { - ENUM_WINDOWS_PARAM& param = *(ENUM_WINDOWS_PARAM*)lParam; - - if (IsTargetCoreWindow(hWnd)) { - param.hWnds->push_back(hWnd); - } + if (dwAttribute != DWMWA_CLOAK || cbAttribute != sizeof(BOOL)) { + return original(); + } - return TRUE; - }, - (LPARAM)¶m); + BOOL cloak = *(BOOL*)pvAttribute; + if (cloak) { + return original(); + } - return hWnds; -} + Wh_Log(L"> %08X", (DWORD)(DWORD_PTR)hwnd); -void AdjustCoreWindowSize(int x, int y, int* width, int* height) { - if (g_target != Target::StartMenu) { - return; + DWORD processId = 0; + if (!hwnd || !GetWindowThreadProcessId(hwnd, &processId)) { + return original(); } - const POINT pt = {x, y}; - HMONITOR monitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); + std::wstring processFileName = GetProcessFileName(processId); - if (g_unloading) { - MONITORINFO monitorInfo{ - .cbSize = sizeof(MONITORINFO), - }; - GetMonitorInfo(monitor, &monitorInfo); + enum class Target { + StartMenu, + SearchHost, + }; + Target target; - *width = monitorInfo.rcWork.right - monitorInfo.rcWork.left; - // *height = monitorInfo.rcWork.bottom - monitorInfo.rcWork.top; - return; + if (_wcsicmp(processFileName.c_str(), L"StartMenuExperienceHost.exe") == + 0) { + target = Target::StartMenu; + } else if (_wcsicmp(processFileName.c_str(), L"SearchHost.exe") == 0) { + target = Target::SearchHost; + } else { + return original(); } + HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONEAREST); + UINT monitorDpiX = 96; UINT monitorDpiY = 96; GetDpiForMonitor(monitor, MDT_DEFAULT, &monitorDpiX, &monitorDpiY); - const int w1 = - MulDiv(g_settings.startMenuWidth ? g_settings.startMenuWidth : 660, - monitorDpiX, 96); - if (*width > w1) { - *width = w1; - } - - // const int h1 = MulDiv(750, monitorDpiY, 96); - // const int h2 = MulDiv(694, monitorDpiY, 96); - // if (*height >= h1) { - // *height = h1; - // } else if (*height >= h2) { - // *height = h2; - // } -} - -void AdjustCoreWindowPos(int* x, int* y, int width, int height) { - if (g_unloading) { - if (g_target == Target::StartMenu) { - *x = 0; - *y = 0; - } - - return; - } - - const POINT pt = {*x, *y}; - HMONITOR monitor = MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); - MONITORINFO monitorInfo{ .cbSize = sizeof(MONITORINFO), }; GetMonitorInfo(monitor, &monitorInfo); - *x = monitorInfo.rcWork.left; -} - -void ApplySettings() { - for (HWND hCoreWnd : GetCoreWindows()) { - Wh_Log(L"Adjusting core window %08X", (DWORD)(ULONG_PTR)hCoreWnd); - - RECT rc; - if (!GetWindowRect(hCoreWnd, &rc)) { - continue; - } - - int x = rc.left; - int y = rc.top; - int cx = rc.right - rc.left; - int cy = rc.bottom - rc.top; - - AdjustCoreWindowSize(x, y, &cx, &cy); - AdjustCoreWindowPos(&x, &y, cx, cy); - - SetWindowPos_Original(hCoreWnd, nullptr, x, y, cx, cy, - SWP_NOZORDER | SWP_NOACTIVATE); + RECT targetRect; + if (!GetWindowRect(hwnd, &targetRect)) { + return original(); } -} -using CreateWindowInBand_t = HWND(WINAPI*)(DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int X, - int Y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - PVOID lpParam, - DWORD dwBand); -CreateWindowInBand_t CreateWindowInBand_Original; -HWND WINAPI CreateWindowInBand_Hook(DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int X, - int Y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - PVOID lpParam, - DWORD dwBand) { - BOOL bTextualClassName = ((ULONG_PTR)lpClassName & ~(ULONG_PTR)0xffff) != 0; - if (bTextualClassName && - _wcsicmp(lpClassName, L"Windows.UI.Core.CoreWindow") == 0) { - Wh_Log(L"Creating core window"); - AdjustCoreWindowSize(X, Y, &nWidth, &nHeight); - AdjustCoreWindowPos(&X, &Y, nWidth, nHeight); - } - - return CreateWindowInBand_Original( - dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, - hWndParent, hMenu, hInstance, lpParam, dwBand); -} + int x = targetRect.left; + int y = targetRect.top; + int cx = targetRect.right - targetRect.left; + int cy = targetRect.bottom - targetRect.top; + + if (target == Target::StartMenu) { + // Only change width. + int cxNew; + + if (g_settings.startMenuOnTheLeft) { + cxNew = MulDiv( + g_settings.startMenuWidth ? g_settings.startMenuWidth : 660, + monitorDpiX, 96); + g_startMenuWnd = hwnd; + g_startMenuOriginalWidth = cx; + } else { + if (!g_startMenuOriginalWidth) { + return original(); + } -using CreateWindowInBandEx_t = HWND(WINAPI*)(DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int X, - int Y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - PVOID lpParam, - DWORD dwBand, - DWORD dwTypeFlags); -CreateWindowInBandEx_t CreateWindowInBandEx_Original; -HWND WINAPI CreateWindowInBandEx_Hook(DWORD dwExStyle, - LPCWSTR lpClassName, - LPCWSTR lpWindowName, - DWORD dwStyle, - int X, - int Y, - int nWidth, - int nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - PVOID lpParam, - DWORD dwBand, - DWORD dwTypeFlags) { - BOOL bTextualClassName = ((ULONG_PTR)lpClassName & ~(ULONG_PTR)0xffff) != 0; - if (bTextualClassName && - _wcsicmp(lpClassName, L"Windows.UI.Core.CoreWindow") == 0) { - Wh_Log(L"Creating core window"); - AdjustCoreWindowSize(X, Y, &nWidth, &nHeight); - AdjustCoreWindowPos(&X, &Y, nWidth, nHeight); - } - - return CreateWindowInBandEx_Original( - dwExStyle, lpClassName, lpWindowName, dwStyle, X, Y, nWidth, nHeight, - hWndParent, hMenu, hInstance, lpParam, dwBand, dwTypeFlags); -} + cxNew = g_startMenuOriginalWidth; + g_startMenuWnd = nullptr; + g_startMenuOriginalWidth = 0; + } -BOOL WINAPI SetWindowPos_Hook(HWND hWnd, - HWND hWndInsertAfter, - int X, - int Y, - int cx, - int cy, - UINT uFlags) { - auto original = [&]() { - return SetWindowPos_Original(hWnd, hWndInsertAfter, X, Y, cx, cy, - uFlags); - }; + if (cxNew == cx) { + return original(); + } - if (!IsTargetCoreWindow(hWnd)) { - return original(); - } + cx = cxNew; + } else if (target == Target::SearchHost) { + // Only change x. + int xNew; - Wh_Log(L"%08X %08X", (DWORD)(ULONG_PTR)hWnd, uFlags); + if (g_settings.startMenuOnTheLeft) { + // Not centered or already changed. + if (x == monitorInfo.rcWork.left) { + return original(); + } - if ((uFlags & (SWP_NOSIZE | SWP_NOMOVE)) == (SWP_NOSIZE | SWP_NOMOVE)) { - return original(); - } + xNew = monitorInfo.rcWork.left; + g_searchMenuWnd = hwnd; + g_searchMenuOriginalX = x; + } else { + if (!g_searchMenuOriginalX) { + return original(); + } - RECT rc{}; - GetWindowRect(hWnd, &rc); + xNew = g_searchMenuOriginalX; + g_searchMenuWnd = nullptr; + g_searchMenuOriginalX = 0; + } - // SearchHost is being moved by explorer.exe, then the size is adjusted - // by SearchHost itself. Make SearchHost adjust the position too. A - // similar workaround is needed for other windows. - if (uFlags & SWP_NOMOVE) { - uFlags &= ~SWP_NOMOVE; - X = rc.left; - Y = rc.top; - } + if (xNew == x) { + return original(); + } - int width; - int height; - if (uFlags & SWP_NOSIZE) { - width = rc.right - rc.left; - height = rc.bottom - rc.top; - AdjustCoreWindowSize(X, Y, &width, &height); - } else { - AdjustCoreWindowSize(X, Y, &cx, &cy); - width = cx; - height = cy; + x = xNew; } - if (!(uFlags & SWP_NOMOVE)) { - AdjustCoreWindowPos(&X, &Y, width, height); - } + SetWindowPos(hwnd, nullptr, x, y, cx, cy, SWP_NOZORDER | SWP_NOACTIVATE); - return SetWindowPos_Original(hWnd, hWndInsertAfter, X, Y, cx, cy, uFlags); + return original(); } -} // namespace CoreWindowUI - void LoadSettings() { g_settings.startMenuOnTheLeft = Wh_GetIntSetting(L"startMenuOnTheLeft"); g_settings.startMenuWidth = Wh_GetIntSetting(L"startMenuWidth"); @@ -849,63 +739,6 @@ BOOL Wh_ModInit() { LoadSettings(); - g_target = Target::Explorer; - - WCHAR moduleFilePath[MAX_PATH]; - switch ( - GetModuleFileName(nullptr, moduleFilePath, ARRAYSIZE(moduleFilePath))) { - case 0: - case ARRAYSIZE(moduleFilePath): - Wh_Log(L"GetModuleFileName failed"); - break; - - default: - if (PCWSTR moduleFileName = wcsrchr(moduleFilePath, L'\\')) { - moduleFileName++; - if (_wcsicmp(moduleFileName, L"StartMenuExperienceHost.exe") == - 0) { - g_target = Target::StartMenu; - } else if (_wcsicmp(moduleFileName, L"SearchHost.exe") == 0) { - g_target = Target::SearchHost; - } - } else { - Wh_Log(L"GetModuleFileName returned an unsupported path"); - } - break; - } - - if (g_target == Target::StartMenu || g_target == Target::SearchHost) { - if (!g_settings.startMenuOnTheLeft) { - return FALSE; - } - - HMODULE user32Module = LoadLibrary(L"user32.dll"); - if (user32Module) { - void* pCreateWindowInBand = - (void*)GetProcAddress(user32Module, "CreateWindowInBand"); - if (pCreateWindowInBand) { - Wh_SetFunctionHook( - pCreateWindowInBand, - (void*)CoreWindowUI::CreateWindowInBand_Hook, - (void**)&CoreWindowUI::CreateWindowInBand_Original); - } - - void* pCreateWindowInBandEx = - (void*)GetProcAddress(user32Module, "CreateWindowInBandEx"); - if (pCreateWindowInBandEx) { - Wh_SetFunctionHook( - pCreateWindowInBandEx, - (void*)CoreWindowUI::CreateWindowInBandEx_Hook, - (void**)&CoreWindowUI::CreateWindowInBandEx_Original); - } - } - - Wh_SetFunctionHook((void*)SetWindowPos, - (void*)CoreWindowUI::SetWindowPos_Hook, - (void**)&CoreWindowUI::SetWindowPos_Original); - return TRUE; - } - if (!HookTaskbarDllSymbols()) { return FALSE; } @@ -914,20 +747,26 @@ BOOL Wh_ModInit() { return FALSE; } + HMODULE dwmapiModule = LoadLibrary(L"dwmapi.dll"); + if (dwmapiModule) { + FARPROC pDwmSetWindowAttribute = + GetProcAddress(dwmapiModule, "DwmSetWindowAttribute"); + if (pDwmSetWindowAttribute) { + Wh_SetFunctionHook((void*)pDwmSetWindowAttribute, + (void*)DwmSetWindowAttribute_Hook, + (void**)&DwmSetWindowAttribute_Original); + } + } + return TRUE; } void Wh_ModAfterInit() { Wh_Log(L">"); - if (g_target == Target::Explorer) { - HWND hTaskbarWnd = GetTaskbarWnd(); - if (hTaskbarWnd) { - ApplySettings(hTaskbarWnd); - } - } else if (g_target == Target::StartMenu || - g_target == Target::SearchHost) { - CoreWindowUI::ApplySettings(); + HWND hTaskbarWnd = GetTaskbarWnd(); + if (hTaskbarWnd) { + ApplySettings(hTaskbarWnd); } } @@ -936,33 +775,50 @@ void Wh_ModBeforeUninit() { g_unloading = true; - if (g_target == Target::Explorer) { - HWND hTaskbarWnd = GetTaskbarWnd(); - if (hTaskbarWnd) { - ApplySettings(hTaskbarWnd); - } - } else if (g_target == Target::StartMenu || - g_target == Target::SearchHost) { - CoreWindowUI::ApplySettings(); + HWND hTaskbarWnd = GetTaskbarWnd(); + if (hTaskbarWnd) { + ApplySettings(hTaskbarWnd); } } void Wh_ModUninit() { Wh_Log(L">"); -} -BOOL Wh_ModSettingsChanged(BOOL* bReload) { - Wh_Log(L">"); + if (g_startMenuWnd && g_startMenuOriginalWidth) { + RECT rect; + if (GetWindowRect(g_startMenuWnd, &rect)) { + int x = rect.left; + int y = rect.top; + int cx = rect.right - rect.left; + int cy = rect.bottom - rect.top; + + if (g_startMenuOriginalWidth != cx) { + cx = g_startMenuOriginalWidth; + SetWindowPos(g_startMenuWnd, nullptr, x, y, cx, cy, + SWP_NOZORDER | SWP_NOACTIVATE); + } + } + } - LoadSettings(); + if (g_searchMenuWnd && g_searchMenuOriginalX) { + RECT rect; + if (GetWindowRect(g_searchMenuWnd, &rect)) { + int x = rect.left; + int y = rect.top; + int cx = rect.right - rect.left; + int cy = rect.bottom - rect.top; - if (g_target == Target::StartMenu || g_target == Target::SearchHost) { - if (!g_settings.startMenuOnTheLeft) { - return FALSE; + if (g_searchMenuOriginalX != x) { + x = g_searchMenuOriginalX; + SetWindowPos(g_searchMenuWnd, nullptr, x, y, cx, cy, + SWP_NOZORDER | SWP_NOACTIVATE); + } } - - CoreWindowUI::ApplySettings(); } +} - return TRUE; +void Wh_ModSettingsChanged() { + Wh_Log(L">"); + + LoadSettings(); }