1
0
mirror of https://github.com/valinet/ExplorerPatcher.git synced 2025-02-20 20:41:26 +01:00

* Weather widget can now show on the left/top side of the taskbar

* Weather widget can display condition on 2 lines
* Reliability improvements for the centered Windows 10 taskbar which now also works along with other taskbar toolbars
This commit is contained in:
Valentin Radu 2022-03-09 04:17:56 +02:00
parent 8c99264420
commit de2e1b5730
5 changed files with 619 additions and 155 deletions

View File

@ -1,36 +1,12 @@
#include "TaskbarCenter.h"
extern HWND PeopleButton_LastHWND;
extern DWORD dwWeatherToLeft;
extern DWORD dwOldTaskbarAl;
extern DWORD dwMMOldTaskbarAl;
extern wchar_t* EP_TASKBAR_LENGTH_PROP_NAME;
#define EP_TASKBAR_LENGTH_TOO_SMALL 20
inline BOOL TaskbarCenter_IsTaskbarHorizontal(HWND hWnd)
{
__int64 v1;
__int64 result;
v1 = *((__int64*)GetWindowLongPtrW(hWnd, 0) + 13);
result = 1i64;
if (v1)
return (*(__int64(__fastcall**)(__int64))(*(__int64*)v1 + 96))(v1);
return result;
}
inline BOOL TaskbarCenter_ShouldCenter(DWORD dwSetting)
{
return (dwSetting & 0b001);
}
inline BOOL TaskbarCenter_ShouldStartBeCentered(DWORD dwSetting)
{
return (dwSetting & 0b010);
}
inline BOOL TaskbarCenter_ShouldLeftAlignWhenSpaceConstrained(DWORD dwSetting)
{
return (dwSetting & 0b100);
}
HRESULT TaskbarCenter_Center(HWND hWnd, HWND hWndTaskbar, RECT rc, BOOL bIsTaskbarHorizontal)
{
HRESULT hr = S_OK;
@ -147,9 +123,16 @@ BOOL TaskbarCenter_GetClientRectHook(HWND hWnd, LPRECT lpRect)
}
hWndStart = FindWindowExW(hWndTaskbar, NULL, L"Start", NULL);
BOOL bIsTaskbarHorizontal = TaskbarCenter_IsTaskbarHorizontal(hWnd);
BOOL bIsWeatherAvailable = FALSE;
HWND hReBarWindow32 = NULL;
if (bIsPrimaryTaskbar) hReBarWindow32 = FindWindowExW(hWndTaskbar, NULL, L"ReBarWindow32", NULL);
HWND hPeopleBand = NULL;
if (bIsPrimaryTaskbar) hPeopleBand = FindWindowExW(hReBarWindow32, NULL, L"PeopleBand", NULL);
bIsWeatherAvailable = hPeopleBand && dwWeatherToLeft;
BOOL bWasLeftAlignedDueToSpaceConstraints = FALSE;
if (TaskbarCenter_ShouldCenter(dwSetting))
{
if (TaskbarCenter_ShouldStartBeCentered(dwSetting) && hWndStart)
if (hWndStart)
{
GetClientRect(hWndStart, &rcStart);
HWND hTrayButton = NULL;
@ -219,42 +202,97 @@ BOOL TaskbarCenter_GetClientRectHook(HWND hWnd, LPRECT lpRect)
}
else
{
RECT rcPeopleBand;
SetRect(&rcPeopleBand, 0, 0, 0, 0);
RECT rcReBarWindow32;
SetRect(&rcReBarWindow32, 0, 0, 0, 0);
if (hPeopleBand)
{
GetClientRect(hPeopleBand, &rcPeopleBand);
}
if (hReBarWindow32)
{
GetClientRect(hReBarWindow32, &rcReBarWindow32);
}
RECT rc;
GetWindowRect(hWnd, &rc);
//MARGINS mBand;
//mBand.cxLeftWidth = 0; mBand.cxRightWidth = 0; mBand.cyBottomHeight = 0; mBand.cyTopHeight = 0;
//if (bIsPrimaryTaskbar) SendMessageW(hReBarWindow32, RB_GETBANDMARGINS, 0, &mBand);
//if (TaskbarCenter_ShouldStartBeCentered(dwSetting))
//{
// rc.left -= mBand.cxLeftWidth;
//}
//else
//{
// rc.left += mBand.cxLeftWidth;
//}
DWORD dwAdd = 0;
if (TaskbarCenter_ShouldStartBeCentered(dwSetting) && hWndStart)
{
dwLength += (bIsTaskbarHorizontal ? (rcStart.right - rcStart.left) : (rcStart.bottom - rcStart.top));
dwAdd += (bIsTaskbarHorizontal ? (rcStart.right - rcStart.left) : (rcStart.bottom - rcStart.top));
}
bWasCalled = GetClientRect(hWnd, lpRect);
long res = 0;
if (bIsTaskbarHorizontal)
{
res = ((mi.rcMonitor.right - mi.rcMonitor.left) - dwLength) / 2 - (!TaskbarCenter_ShouldStartBeCentered(dwSetting) ? (rc.left - mi.rcMonitor.left) : 0);
res = ((mi.rcMonitor.right - mi.rcMonitor.left) - dwLength - dwAdd) / 2 - (rc.left - mi.rcMonitor.left);
if (res < 0)
{
dwLength -= abs(res) * 2;
res = ((mi.rcMonitor.right - mi.rcMonitor.left) - dwLength - dwAdd) / 2 - (rc.left - mi.rcMonitor.left);
}
if (TaskbarCenter_ShouldStartBeCentered(dwSetting))
{
res += (rcStart.right - rcStart.left);
}
}
else
{
res = ((mi.rcMonitor.bottom - mi.rcMonitor.top) - dwLength) / 2 - (!TaskbarCenter_ShouldStartBeCentered(dwSetting) ? (rc.top - mi.rcMonitor.top) : 0);
res = ((mi.rcMonitor.bottom - mi.rcMonitor.top) - dwLength - dwAdd) / 2 - (rc.top - mi.rcMonitor.top);
if (res < 0)
{
dwLength -= abs(res) * 2;
res = ((mi.rcMonitor.bottom - mi.rcMonitor.top) - dwLength - dwAdd) / 2 - (rc.top - mi.rcMonitor.top);
}
if (TaskbarCenter_ShouldStartBeCentered(dwSetting))
{
res += (rcStart.bottom - rcStart.top);
}
}
if (res + dwLength + 5 - (TaskbarCenter_ShouldStartBeCentered(dwSetting) ? (bIsTaskbarHorizontal ? (rc.left - mi.rcMonitor.left) : (rc.top - mi.rcMonitor.top)) : 0) < (bIsTaskbarHorizontal ? lpRect->right : lpRect->bottom))
if ((res + dwLength + 50 >= (bIsTaskbarHorizontal ? lpRect->right : lpRect->bottom)))
{
if (bIsTaskbarHorizontal)
{
lpRect->left = res;
}
else
{
lpRect->top = res;
}
if (TaskbarCenter_ShouldLeftAlignWhenSpaceConstrained(dwSetting) || !bIsTaskbarHorizontal)
{
bWasLeftAlignedDueToSpaceConstraints = TRUE;
res = 0;
if (bIsTaskbarHorizontal)
{
lpRect->right = (TaskbarCenter_ShouldStartBeCentered(dwSetting) ? (rc.left - mi.rcMonitor.left) : 0) + 10 + lpRect->right;
if (TaskbarCenter_ShouldStartBeCentered(dwSetting))
{
res += (rcStart.right - rcStart.left);
}
}
else
{
lpRect->bottom = (TaskbarCenter_ShouldStartBeCentered(dwSetting) ? (rc.top - mi.rcMonitor.top) : 0) + 10 + lpRect->bottom;
if (TaskbarCenter_ShouldStartBeCentered(dwSetting))
{
res += (rcStart.bottom - rcStart.top);
}
}
}
}
if (bIsTaskbarHorizontal)
{
lpRect->left = res;
//lpRect->right = MIN(MAX(lpRect->right, MIN_DIM), MAX(res + dwLength + 100, MIN_DIM));
}
else
{
lpRect->top = res;
//lpRect->bottom = MIN(MAX(lpRect->bottom, MIN_DIM), MAX(res + dwLength + 100, MIN_DIM));
}
if (TaskbarCenter_ShouldStartBeCentered(dwSetting) && hWndStart)
{
if (bIsTaskbarHorizontal)
@ -301,6 +339,64 @@ BOOL TaskbarCenter_GetClientRectHook(HWND hWnd, LPRECT lpRect)
RemovePropW(hWnd, EP_TASKBAR_LENGTH_PROP_NAME);
}
}
if (bIsPrimaryTaskbar)
{
BOOL bWeatherAlignment = FALSE;
if (bIsWeatherAvailable)
{
bWeatherAlignment = TRUE;
}
else
{
bWeatherAlignment = FALSE;
}
/*if (bIsWeatherAvailable && bWasLeftAlignedDueToSpaceConstraints && dwWeatherToLeft == 2)
{
bWeatherAlignment = FALSE;
}*/
REBARBANDINFOW rbi;
rbi.cbSize = sizeof(REBARBANDINFOW);
rbi.fMask = RBBIM_CHILD;
SendMessageW(hReBarWindow32, RB_GETBANDINFOW, 0, &rbi);
BOOL bIsFirstBandPeopleBand = GetClassWord(rbi.hwndChild, GCW_ATOM) == RegisterWindowMessageW(L"PeopleBand");
if (bWeatherAlignment ? !bIsFirstBandPeopleBand : bIsFirstBandPeopleBand)
{
int k = SendMessageW(hReBarWindow32, RB_GETBANDCOUNT, 0, 0);
int i = 1;
if (bWeatherAlignment)
{
for (i = 1; i < k; ++i)
{
rbi.cbSize = sizeof(REBARBANDINFOW);
rbi.fMask = RBBIM_CHILD;
SendMessageW(hReBarWindow32, RB_GETBANDINFOW, i, &rbi);
if (GetClassWord(rbi.hwndChild, GCW_ATOM) == RegisterWindowMessageW(L"PeopleBand"))
{
break;
}
}
}
else i = k - 1;
SendMessageW(hReBarWindow32, RB_MOVEBAND, 0, i);
SendNotifyMessageW(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)L"TraySettings");
/*if (PeopleButton_LastHWND)
{
//if (epw_dummytext[0] == 0) epw_dummytext = L"\u2009";
//else epw_dummytext = L"";
//InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
if (FindWindowW(L"Shell_SecondaryTrayWnd", NULL))
{
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 425, 0);
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 425, 0);
}
else
{
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 424, 0);
PostMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 424, 0);
}
}*/
}
}
if ((!TaskbarCenter_ShouldCenter(dwSetting) || !TaskbarCenter_ShouldStartBeCentered(dwSetting)) && hWndStart)
{
GetWindowRect(hWndStart, &rcStart);

View File

@ -5,7 +5,38 @@
#include <oleacc.h>
#include <tchar.h>
#pragma comment(lib, "Oleacc.lib")
#include <CommCtrl.h>
#include <uxtheme.h>
#include <valinet/hooking/iatpatch.h>
#define MAX(a,b) ((a) > (b) ? (a) : (b))
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MIN_DIM 600
inline BOOL TaskbarCenter_IsTaskbarHorizontal(HWND hWnd)
{
__int64 v1;
__int64 result;
v1 = *((__int64*)GetWindowLongPtrW(hWnd, 0) + 13);
result = 1i64;
if (v1)
return (*(__int64(__fastcall**)(__int64))(*(__int64*)v1 + 96))(v1);
return result;
}
inline BOOL TaskbarCenter_ShouldCenter(DWORD dwSetting)
{
return (dwSetting & 0b001);
}
inline BOOL TaskbarCenter_ShouldStartBeCentered(DWORD dwSetting)
{
return (dwSetting & 0b010);
}
inline BOOL TaskbarCenter_ShouldLeftAlignWhenSpaceConstrained(DWORD dwSetting)
{
return (dwSetting & 0b100);
}
BOOL TaskbarCenter_GetClientRectHook(HWND hWnd, LPRECT lpRect);
#endif

View File

@ -125,6 +125,8 @@ DWORD dwWeatherGeolocationMode = 0;
DWORD dwWeatherWindowCornerPreference = DWMWCP_ROUND;
DWORD dwWeatherDevMode = FALSE;
DWORD dwWeatherIconPack = EP_WEATHER_ICONPACK_MICROSOFT;
DWORD dwWeatherToLeft = 0;
DWORD dwWeatherContentsMode = 0;
WCHAR* wszWeatherTerm = NULL;
WCHAR* wszWeatherLanguage = NULL;
WCHAR* wszEPWeatherKillswitch = NULL;
@ -135,6 +137,10 @@ DWORD bWasRemoveExtraGapAroundPinnedItems = FALSE;
DWORD bRemoveExtraGapAroundPinnedItems = FALSE;
DWORD dwOldTaskbarAl = 0b110;
DWORD dwMMOldTaskbarAl = 0b110;
DWORD dwTaskbarSmallIcons = FALSE;
DWORD dwShowTaskViewButton = FALSE;
DWORD dwSearchboxTaskbarMode = FALSE;
DWORD dwTaskbarDa = FALSE;
int Code = 0;
HRESULT InjectStartFromExplorer();
void InvokeClockFlyout();
@ -190,6 +196,7 @@ DWORD S_Icon_Dark_Widgets = 0;
#include "updates.h"
DWORD dwUpdatePolicy = UPDATE_POLICY_DEFAULT;
wchar_t* EP_TASKBAR_LENGTH_PROP_NAME = L"EPTBLEN";
HWND hWinXWnd;
HRESULT WINAPI _DllRegisterServer();
HRESULT WINAPI _DllUnregisterServer();
@ -743,13 +750,43 @@ void LaunchNetworkTargets(DWORD dwTarget)
#pragma region "Service Window"
#ifdef _WIN64
HWND hWndServiceWindow = NULL;
void FixUpCenteredTaskbar()
{
InvalidateRect(FindWindowExW(FindWindowExW(FindWindowExW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), NULL, L"ReBarWindow32", NULL), NULL, L"MSTaskSwWClass", NULL), NULL, L"MSTaskListWClass", NULL), NULL, TRUE);
HWND hWndTemp = NULL;
while (hWndTemp = FindWindowExW(NULL, hWndTemp, L"Shell_SecondaryTrayWnd", NULL))
//SendNotifyMessageW(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)L"TraySettings");
BOOL failed = FALSE;
int k = 0;
RECT rc;
BOOL vis = TRUE, vis2 = TRUE;
HWND htp = FindWindowExW(FindWindowExW(FindWindowW(L"Shell_TrayWnd", NULL), NULL, L"TrayNotifyWnd", NULL), NULL, L"TIPBand", NULL);
if (!htp) vis = FALSE;
else
{
InvalidateRect(FindWindowExW(FindWindowExW(hWndTemp, NULL, L"WorkerW", NULL), NULL, L"MSTaskListWClass", NULL), NULL, TRUE);
GetClientRect(htp, &rc);
vis = !(!rc.right || !rc.bottom);
}
for (int i = 0; i < 2; ++i)
{
vis2 = !vis;
Sleep(50);
SendMessageW(FindWindowW(L"Shell_TrayWnd", NULL), WM_COMMAND, 436, 0);
while (vis != vis2)
{
if (!htp) htp = FindWindowExW(FindWindowExW(FindWindowW(L"Shell_TrayWnd", NULL), NULL, L"TrayNotifyWnd", NULL), NULL, L"TIPBand", NULL);
if (htp)
{
GetClientRect(htp, &rc);
vis = !(!rc.right || !rc.bottom);
}
k++;
if (k == 100)
{
failed = TRUE;
break;
}
Sleep(10);
}
}
}
@ -760,22 +797,35 @@ LRESULT CALLBACK EP_Service_Window_WndProc(
WPARAM wParam,
LPARAM lParam)
{
if (uMsg == WM_HOTKEY && (wParam == 1 || wParam == 2))
static UINT s_uTaskbarRestart = 0;
if (uMsg == WM_CREATE)
{
s_uTaskbarRestart = RegisterWindowMessageW(L"TaskbarCreated");
}
else if (uMsg == WM_HOTKEY && (wParam == 1 || wParam == 2))
{
InvokeClockFlyout();
return 0;
}
else if (uMsg == WM_TIMER && wParam == 1)
else if (uMsg == s_uTaskbarRestart && bOldTaskbar && (dwOldTaskbarAl || dwMMOldTaskbarAl))
{
SetTimer(hWnd, 1, 1000, NULL);
}
else if (uMsg == WM_TIMER && wParam < 2)
{
FixUpCenteredTaskbar();
SetTimer(hWnd, 2, 1000, NULL);
KillTimer(hWnd, 1);
if (wParam != 2 - 1) SetTimer(hWnd, wParam + 1, 1000, NULL);
KillTimer(hWnd, wParam);
return 0;
}
else if (uMsg == WM_TIMER && wParam == 2)
else if (uMsg == WM_TIMER && wParam == 10)
{
FixUpCenteredTaskbar();
KillTimer(hWnd, 2);
if (GetClassWord(GetForegroundWindow(), GCW_ATOM) != RegisterWindowMessageW(L"Windows.UI.Core.CoreWindow"))
{
DWORD dwVal = 1;
RegSetKeyValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarAl", REG_DWORD, &dwVal, sizeof(DWORD));
KillTimer(hWnd, 10);
}
return 0;
}
@ -792,7 +842,7 @@ DWORD EP_ServiceWindowThread(DWORD unused)
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
RegisterClassW(&wc);
HWND hWnd = CreateWindowExW(
hWndServiceWindow = CreateWindowExW(
0,
EP_SERVICE_WINDOW_CLASS_NAME,
0,
@ -806,17 +856,13 @@ DWORD EP_ServiceWindowThread(DWORD unused)
GetModuleHandle(NULL),
NULL
);
if (hWnd)
if (hWndServiceWindow)
{
if (bClockFlyoutOnWinC)
{
RegisterHotKey(hWnd, 1, MOD_WIN | MOD_NOREPEAT, 'C');
}
RegisterHotKey(hWnd, 2, MOD_WIN | MOD_ALT, 'D');
if (bOldTaskbar && (dwOldTaskbarAl || dwMMOldTaskbarAl))
{
SetTimer(hWnd, 1, 5000, NULL);
RegisterHotKey(hWndServiceWindow, 1, MOD_WIN | MOD_NOREPEAT, 'C');
}
RegisterHotKey(hWndServiceWindow, 2, MOD_WIN | MOD_ALT, 'D');
MSG msg;
BOOL bRet;
while ((bRet = GetMessageW(&msg, NULL, 0, 0)) != 0)
@ -831,7 +877,7 @@ DWORD EP_ServiceWindowThread(DWORD unused)
DispatchMessageW(&msg);
}
}
DestroyWindow(hWnd);
DestroyWindow(hWndServiceWindow);
}
SetEvent(hCanStartSws);
}
@ -927,6 +973,83 @@ void ToggleActionCenter()
{
PostMessageW(FindWindowExW(NULL, NULL, L"Shell_TrayWnd", NULL), WM_HOTKEY, 500, MAKELPARAM(MOD_WIN, 0x41));
}
#ifdef _WIN64
void ToggleLauncherTipContextMenu()
{
if (hIsWinXShown)
{
SendMessage(hWinXWnd, WM_CLOSE, 0, 0);
}
else
{
HWND hWnd = FindWindowEx(
NULL,
NULL,
L"Shell_TrayWnd",
NULL
);
if (hWnd)
{
hWnd = FindWindowEx(
hWnd,
NULL,
L"Start",
NULL
);
if (hWnd)
{
POINT pt = GetDefaultWinXPosition(FALSE, NULL, NULL, TRUE, FALSE);
// Finally implemented a variation of
// https://github.com/valinet/ExplorerPatcher/issues/3
// inspired by how the real Start button activates this menu
// (CPearl::_GetLauncherTipContextMenu)
// This also works when auto hide taskbar is on (#63)
HRESULT hr = S_OK;
IUnknown* pImmersiveShell = NULL;
hr = CoCreateInstance(
&CLSID_ImmersiveShell,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IServiceProvider,
&pImmersiveShell
);
if (SUCCEEDED(hr))
{
IImmersiveMonitorService* pMonitorService = NULL;
IUnknown_QueryService(
pImmersiveShell,
&SID_IImmersiveMonitorService,
&IID_IImmersiveMonitorService,
&pMonitorService
);
if (pMonitorService)
{
ILauncherTipContextMenu* pMenu = NULL;
pMonitorService->lpVtbl->QueryServiceFromWindow(
pMonitorService,
hWnd,
&IID_ILauncherTipContextMenu,
&IID_ILauncherTipContextMenu,
&pMenu
);
if (pMenu)
{
pMenu->lpVtbl->ShowLauncherTipContextMenu(
pMenu,
&pt
);
pMenu->lpVtbl->Release(pMenu);
}
pMonitorService->lpVtbl->Release(pMonitorService);
}
pImmersiveShell->lpVtbl->Release(pImmersiveShell);
}
}
}
}
}
#endif
#pragma endregion
@ -1073,7 +1196,6 @@ typedef struct
IUnknown* iunk;
BOOL bShouldCenterWinXHorizontally;
} ShowLauncherTipContextMenuParameters;
HWND hWinXWnd;
DWORD ShowLauncherTipContextMenu(
ShowLauncherTipContextMenuParameters* params
)
@ -1284,7 +1406,7 @@ INT64 CLauncherTipContextMenu_ShowLauncherTipContextMenuHook(
rcHitZone.top = pt->y - 5;
rcHitZone.bottom = pt->y + 5;
//printf("%d %d = %d %d %d %d\n", posCursor.x, posCursor.y, rcHitZone.left, rcHitZone.right, rcHitZone.top, rcHitZone.bottom);
if (bBottom && IsThemeActive() && PtInRect(&rcHitZone, posCursor))
if (bBottom && IsThemeActive() && PtInRect(&rcHitZone, posCursor) && GetClassWord(WindowFromPoint(point), GCW_ATOM) == RegisterWindowMessageW(L"Start"))
{
HMONITOR hMonitor = MonitorFromPoint(point, MONITOR_DEFAULTTOPRIMARY);
MONITORINFO mi;
@ -1745,6 +1867,102 @@ DWORD FixTaskbarAutohide(DWORD unused)
#pragma region "Shell_TrayWnd subclass"
#ifdef _WIN64
int HandleTaskbarCornerInteraction(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
POINT pt; pt.x = 0; pt.y = 0;
if (uMsg == WM_RBUTTONUP || uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONDOWN || uMsg == WM_LBUTTONDOWN)
{
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
ClientToScreen(hWnd, &pt);
}
else if (uMsg == WM_NCLBUTTONUP || uMsg == WM_NCRBUTTONUP || uMsg == WM_NCLBUTTONDOWN || uMsg == WM_NCRBUTTONDOWN)
{
DWORD dwPos = GetMessagePos();
pt.x = GET_X_LPARAM(lParam);
pt.y = GET_Y_LPARAM(lParam);
}
HMONITOR hMonitor = MonitorFromPoint(pt, MONITOR_DEFAULTTOPRIMARY);
MONITORINFO mi;
ZeroMemory(&mi, sizeof(MONITORINFO));
mi.cbSize = sizeof(MONITORINFO);
GetMonitorInfoW(hMonitor, &mi);
int t = 2;
BOOL bOk = FALSE;
if (pt.x < mi.rcMonitor.left + t && pt.y > mi.rcMonitor.bottom - t)
{
//printf("bottom left\n");
bOk = TRUE;
}
else if (pt.x < mi.rcMonitor.left + t && pt.y < mi.rcMonitor.top + t)
{
//printf("top left\n");
bOk = TRUE;
}
else if (pt.x > mi.rcMonitor.right - t && pt.y < mi.rcMonitor.top + t)
{
//printf("top right\n");
bOk = TRUE;
}
if (bOk)
{
if (uMsg == WM_RBUTTONUP || uMsg == WM_NCRBUTTONUP || uMsg == WM_RBUTTONDOWN || uMsg == WM_NCRBUTTONDOWN)
{
ToggleLauncherTipContextMenu();
return 1;
}
else if (uMsg == WM_LBUTTONUP || uMsg == WM_NCLBUTTONUP || uMsg == WM_LBUTTONDOWN || uMsg == WM_NCLBUTTONDOWN)
{
DWORD dwVal = 0, dwSize = sizeof(DWORD);
RegGetValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarAl", RRF_RT_DWORD, NULL, &dwVal, &dwSize);
if (dwVal)
{
dwVal = 0;
RegSetKeyValueW(HKEY_CURRENT_USER, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarAl", REG_DWORD, &dwVal, sizeof(DWORD));
if (hWndServiceWindow) SetTimer(hWndServiceWindow, 10, 1000, NULL);
}
OpenStartOnMonitor(hMonitor);
return 1;
}
}
return 0;
}
INT64 ReBarWindow32SubclassProc(_In_ HWND hWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwUnused)
{
if (uMsg == WM_NCDESTROY)
{
RemoveWindowSubclass(hWnd, ReBarWindow32SubclassProc, ReBarWindow32SubclassProc);
}
if (TaskbarCenter_ShouldCenter(dwOldTaskbarAl) && TaskbarCenter_ShouldStartBeCentered(dwOldTaskbarAl) && uMsg == WM_WINDOWPOSCHANGING)
{
LPWINDOWPOS lpWP = lParam;
lpWP->cx += lpWP->x;
lpWP->x = 0;
lpWP->cy += lpWP->y;
lpWP->y = 0;
}
else if (uMsg == RB_INSERTBANDW)
{
REBARBANDINFOW* lpRbi = lParam;
}
else if (uMsg == RB_SETBANDINFOW)
{
REBARBANDINFOW* lpRbi = lParam;
if (GetClassWord(lpRbi->hwndChild, GCW_ATOM) == RegisterWindowMessageW(L"PeopleBand"))
{
lpRbi->fMask |= RBBIM_STYLE;
lpRbi->fStyle &= ~RBBS_FIXEDSIZE;
//lpRbi->fStyle &= ~RBBS_NOGRIPPER;
}
}
else if (TaskbarCenter_ShouldCenter(dwOldTaskbarAl) && TaskbarCenter_ShouldStartBeCentered(dwOldTaskbarAl) && (uMsg == WM_LBUTTONUP || uMsg == WM_RBUTTONUP) && HandleTaskbarCornerInteraction(hWnd, uMsg, wParam, lParam))
{
return 0;
}
return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}
HMENU explorer_LoadMenuW(HINSTANCE hInstance, LPCWSTR lpMenuName)
{
HMENU hMenu = LoadMenuW(hInstance, lpMenuName);
@ -1992,6 +2210,10 @@ INT64 Shell_TrayWndSubclassProc(
}
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
@ -3873,77 +4095,7 @@ LRESULT explorer_SendMessageW(HWND hWndx, UINT uMsg, WPARAM wParam, LPARAM lPara
);
if (hWnd && hWnd == hWndx && wParam == -1)
{
if (hIsWinXShown)
{
SendMessage(hWinXWnd, WM_CLOSE, 0, 0);
}
else
{
hWnd = FindWindowEx(
NULL,
NULL,
L"Shell_TrayWnd",
NULL
);
if (hWnd)
{
hWnd = FindWindowEx(
hWnd,
NULL,
L"Start",
NULL
);
if (hWnd)
{
POINT pt = GetDefaultWinXPosition(FALSE, NULL, NULL, TRUE, FALSE);
// Finally implemented a variation of
// https://github.com/valinet/ExplorerPatcher/issues/3
// inspired by how the real Start button activates this menu
// (CPearl::_GetLauncherTipContextMenu)
// This also works when auto hide taskbar is on (#63)
HRESULT hr = S_OK;
IUnknown* pImmersiveShell = NULL;
hr = CoCreateInstance(
&CLSID_ImmersiveShell,
NULL,
CLSCTX_INPROC_SERVER,
&IID_IServiceProvider,
&pImmersiveShell
);
if (SUCCEEDED(hr))
{
IImmersiveMonitorService* pMonitorService = NULL;
IUnknown_QueryService(
pImmersiveShell,
&SID_IImmersiveMonitorService,
&IID_IImmersiveMonitorService,
&pMonitorService
);
if (pMonitorService)
{
ILauncherTipContextMenu* pMenu = NULL;
pMonitorService->lpVtbl->QueryServiceFromWindow(
pMonitorService,
hWnd,
&IID_ILauncherTipContextMenu,
&IID_ILauncherTipContextMenu,
&pMenu
);
if (pMenu)
{
pMenu->lpVtbl->ShowLauncherTipContextMenu(
pMenu,
&pt
);
pMenu->lpVtbl->Release(pMenu);
}
pMonitorService->lpVtbl->Release(pMonitorService);
}
pImmersiveShell->lpVtbl->Release(pImmersiveShell);
}
}
}
}
ToggleLauncherTipContextMenu();
return 0;
}
}
@ -4099,6 +4251,10 @@ void RecomputeWeatherFlyoutLocation(HWND hWnd)
{
pNewWindow.x = mi.rcWork.right - (rcWeatherFlyoutWindow.right - rcWeatherFlyoutWindow.left);
}
if (mi.rcWork.left > pNewWindow.x)
{
pNewWindow.x = mi.rcWork.left;
}
}
}
}
@ -4117,6 +4273,10 @@ void RecomputeWeatherFlyoutLocation(HWND hWnd)
{
pNewWindow.y = mi.rcWork.bottom - (rcWeatherFlyoutWindow.bottom - rcWeatherFlyoutWindow.top);
}
if (mi.rcWork.top > pNewWindow.y)
{
pNewWindow.y = mi.rcWork.top;
}
}
}
}
@ -4441,17 +4601,20 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
LOGFONTW logFont;
ZeroMemory(&logFont, sizeof(logFont));
LOGFONTW logFont2;
ZeroMemory(&logFont2, sizeof(logFont2));
NONCLIENTMETRICS ncm;
ZeroMemory(&ncm, sizeof(NONCLIENTMETRICS));
ncm.cbSize = sizeof(NONCLIENTMETRICS);
SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &ncm, 0, dpiX);
logFont = ncm.lfCaptionFont;
logFont.lfWeight = FW_NORMAL;
logFont2 = ncm.lfCaptionFont;
logFont2.lfWeight = FW_NORMAL;
logFont2.lfHeight += 1;
if (bEmptyData)
{
DWORD dwVal = 1, dwSize = sizeof(DWORD);
RegGetValueW(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", L"TaskbarSmallIcons", RRF_RT_DWORD, NULL, &dwVal, &dwSize);
if (!dwVal)
if (!dwTaskbarSmallIcons)
{
logFont.lfHeight *= 1.6;
}
@ -4464,6 +4627,7 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
}
}
HFONT hFont = CreateFontIndirectW(&logFont);
HFONT hFont2 = CreateFontIndirectW(&logFont2);
if (hFont)
{
HDC hDC = CreateCompatibleDC(0);
@ -4510,20 +4674,22 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
}
else
{
DWORD dwTextFlags = DT_SINGLELINE | DT_VCENTER | DT_HIDEPREFIX;
DWORD dwWeatherSplit = (dwWeatherContentsMode && (dwWeatherViewMode == EP_WEATHER_VIEW_ICONTEXT || dwWeatherViewMode == EP_WEATHER_VIEW_TEXTONLY) && !dwTaskbarSmallIcons);
DWORD dwTextFlags = DT_SINGLELINE | DT_HIDEPREFIX;
WCHAR wszText1[MAX_PATH];
swprintf_s(wszText1, MAX_PATH, L"%s%s %s", bIsThemeActive ? L"" : L" ", epw_wszTemperature, dwWeatherTemperatureUnit == EP_WEATHER_TUNIT_FAHRENHEIT ? L"\u00B0F" : L"\u00B0C");// epw_wszUnit);
RECT rcText1;
SetRect(&rcText1, 0, 0, a4->right, a4->bottom);
DrawTextW(hDC, wszText1, -1, &rcText1, dwTextFlags | DT_CALCRECT);
rcText1.bottom = a4->bottom;
SetRect(&rcText1, 0, 0, a4->right, dwWeatherSplit ? (a4->bottom / 2) : a4->bottom);
DrawTextW(hDC, wszText1, -1, &rcText1, dwTextFlags | DT_CALCRECT | (dwWeatherSplit ? DT_BOTTOM : DT_VCENTER));
rcText1.bottom = dwWeatherSplit ? (a4->bottom / 2) : a4->bottom;
WCHAR wszText2[MAX_PATH];
swprintf_s(wszText2, MAX_PATH, L"%s%s", bIsThemeActive ? L"" : L" ", epw_wszCondition);
RECT rcText2;
SetRect(&rcText2, 0, 0, a4->right, a4->bottom);
DrawTextW(hDC, wszText2, -1, &rcText2, dwTextFlags | DT_CALCRECT);
rcText2.bottom = a4->bottom;
SetRect(&rcText2, 0, 0, a4->right, dwWeatherSplit ? (a4->bottom / 2) : a4->bottom);
DrawTextW(hDC, wszText2, -1, &rcText2, dwTextFlags | DT_CALCRECT | (dwWeatherSplit ? DT_TOP : DT_VCENTER));
rcText2.bottom = dwWeatherSplit ? (a4->bottom / 2) : a4->bottom;
if (bWeatherFixedSize)
{
@ -4544,7 +4710,10 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
{
case EP_WEATHER_VIEW_ICONTEXT:
case EP_WEATHER_VIEW_TEXTONLY:
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
if (dwWeatherSplit)
addend = MAX((rcText1.right - rcText1.left), (rcText2.right - rcText2.left)) + margin_h;
else
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
break;
case EP_WEATHER_VIEW_ICONTEMP:
case EP_WEATHER_VIEW_TEMPONLY:
@ -4567,7 +4736,10 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
{
case EP_WEATHER_VIEW_ICONTEXT:
case EP_WEATHER_VIEW_TEXTONLY:
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
if (dwWeatherSplit)
addend = MAX((rcText1.right - rcText1.left), (rcText2.right - rcText2.left)) + margin_h;
else
addend = (rcText1.right - rcText1.left) + margin_h + (rcText2.right - rcText2.left) + margin_h;
break;
case EP_WEATHER_VIEW_ICONTEMP:
case EP_WEATHER_VIEW_TEMPONLY: // should be impossible
@ -4633,7 +4805,7 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
{
size.cx = rcText1.right - rcText1.left;
size.cy = rcText1.bottom - rcText1.top;
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText1, hFont, dwTextFlags, size, rgbColor);
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText1, hFont, dwTextFlags | (dwWeatherSplit ? DT_BOTTOM : DT_VCENTER), size, rgbColor);
if (hBitmap)
{
HBITMAP hOldBMP = SelectBitmap(hDC, hBitmap);
@ -4658,7 +4830,7 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
{
size.cx = rcText2.right - rcText2.left;
size.cy = rcText2.bottom - rcText2.top;
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText2, hFont, dwTextFlags, size, rgbColor);
hBitmap = sws_WindowHelpers_CreateAlphaTextBitmap(wszText2, (dwWeatherSplit && hFont2 ? hFont2 : hFont), dwTextFlags | (dwWeatherSplit ? DT_TOP : DT_VCENTER), size, rgbColor);
if (hBitmap)
{
HBITMAP hOldBMP = SelectBitmap(hDC, hBitmap);
@ -4670,7 +4842,7 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xFF;
bf.AlphaFormat = AC_SRC_ALPHA;
GdiAlphaBlend(hdc, start_x + (bIsIconMode ? ((margin_h - p) + rt + (margin_h - p)) : margin_h) + (rcText1.right - rcText1.left) + margin_h, 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
GdiAlphaBlend(hdc, start_x + (bIsIconMode ? ((margin_h - p) + rt + (margin_h - p)) : margin_h) + (dwWeatherSplit ? -1 : (rcText1.right - rcText1.left) + margin_h), dwWeatherSplit ? (a4->bottom / 2 - 1) : 0, BMInf.bmWidth, BMInf.bmHeight, hDC, 0, 0, BMInf.bmWidth, BMInf.bmHeight, bf);
SelectBitmap(hDC, hOldBMP);
DeleteBitmap(hBitmap);
@ -4714,6 +4886,11 @@ __int64 __fastcall PeopleBand_DrawTextWithGlowHook(
SelectFont(hDC, hOldFont);
DeleteDC(hDC);
}
DeleteFont(hFont);
}
if (hFont2)
{
DeleteFont(hFont2);
}
if (IsWindowVisible(hWndWeatherFlyout))
{
@ -6329,6 +6506,36 @@ void WINAPI LoadSettings(LPARAM lParam)
}
}
DWORD dwOldWeatherToLeft = dwWeatherToLeft;
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("WeatherToLeft"),
0,
NULL,
&dwWeatherToLeft,
&dwSize
);
if (dwWeatherToLeft != dwOldWeatherToLeft && PeopleButton_LastHWND)
{
dwRefreshUIMask = REFRESHUI_PEOPLE;
}
DWORD bOldWeatherContentsMode = dwWeatherContentsMode;
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("WeatherContentsMode"),
0,
NULL,
&dwWeatherContentsMode,
&dwSize
);
if (dwWeatherContentsMode != bOldWeatherContentsMode && epw)
{
dwRefreshUIMask |= REFRESHUI_PEOPLE;
}
ReleaseSRWLockShared(&lock_epw);
#endif
@ -6576,6 +6783,8 @@ void WINAPI LoadSettings(LPARAM lParam)
}
if (dwRefreshUIMask & REFRESHUI_PEOPLE)
{
//if (epw_dummytext[0] == 0) epw_dummytext = L"\u2009";
//else epw_dummytext = L"";
#ifdef _WIN64
InvalidateRect(PeopleButton_LastHWND, NULL, TRUE);
#endif
@ -6601,9 +6810,10 @@ void WINAPI LoadSettings(LPARAM lParam)
if (dwRefreshUIMask & REFRESHUI_CENTER)
{
#ifdef _WIN64
ToggleTaskbarAutohide();
Sleep(1000);
ToggleTaskbarAutohide();
//ToggleTaskbarAutohide();
//Sleep(1000);
//ToggleTaskbarAutohide();
FixUpCenteredTaskbar();
#endif
}
}
@ -6662,10 +6872,117 @@ void Explorer_RefreshClock(int unused)
} while (hWnd);
}
void WINAPI Explorer_RefreshUI(int unused)
int numTBButtons = 0;
void WINAPI Explorer_RefreshUI(int src)
{
HKEY hKey = NULL;
DWORD dwSize = 0, dwTemp = 0, dwRefreshMask = 0;
if (src == 1)
{
RegCreateKeyExW(
HKEY_CURRENT_USER,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WOW64_64KEY,
NULL,
&hKey,
NULL
);
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
hKey = NULL;
}
if (hKey)
{
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("TaskbarSmallIcons"),
0,
NULL,
&dwTaskbarSmallIcons,
&dwSize
);
dwTemp = 0;
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("ShowTaskViewButton"),
0,
NULL,
&dwTemp,
&dwSize
);
if (dwTemp != dwShowTaskViewButton)
{
dwShowTaskViewButton = dwTemp;
dwRefreshMask |= REFRESHUI_CENTER;
}
dwTemp = 0;
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("TaskbarDa"),
0,
NULL,
&dwTemp,
&dwSize
);
if (dwTemp != dwTaskbarDa)
{
dwTaskbarDa = dwTemp;
dwRefreshMask |= REFRESHUI_CENTER;
}
RegCloseKey(hKey);
//SearchboxTaskbarMode
}
}
if (src == 2)
{
RegCreateKeyExW(
HKEY_CURRENT_USER,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Search",
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_READ | KEY_WOW64_64KEY,
NULL,
&hKey,
NULL
);
if (hKey == NULL || hKey == INVALID_HANDLE_VALUE)
{
hKey = NULL;
}
if (hKey)
{
dwTemp = 0;
dwSize = sizeof(DWORD);
RegQueryValueExW(
hKey,
TEXT("SearchboxTaskbarMode"),
0,
NULL,
&dwTemp,
&dwSize
);
if (dwTemp != dwSearchboxTaskbarMode)
{
dwSearchboxTaskbarMode = dwTemp;
dwRefreshMask |= REFRESHUI_CENTER;
}
}
}
SendNotifyMessageW(HWND_BROADCAST, WM_WININICHANGE, 0, (LPARAM)L"TraySettings");
Explorer_RefreshClock(0);
if (dwRefreshMask & REFRESHUI_CENTER)
{
#ifdef _WIN64
FixUpCenteredTaskbar();
#endif
}
}
void Explorer_TogglePeopleButton(int unused)
@ -6796,6 +7113,10 @@ HWND CreateWindowExWHook(
{
SetWindowSubclass(hWnd, Shell_TrayWndSubclassProc, Shell_TrayWndSubclassProc, FALSE);
}
else if (bIsExplorerProcess && (*((WORD*)&(lpClassName)+1)) && !_wcsicmp(lpClassName, L"ReBarWindow32") && hWndParent == FindWindowW(L"Shell_TrayWnd", NULL))
{
SetWindowSubclass(hWnd, ReBarWindow32SubclassProc, ReBarWindow32SubclassProc, FALSE);
}
#endif
/*
if (bClassicThemeMitigations && (*((WORD*)&(lpClassName)+1)) && (!wcscmp(lpClassName, L"FolderView")))
@ -8553,7 +8874,7 @@ DWORD Inject(BOOL bIsExplorer)
if (cs < numSettings)
{
settings[cs].callback = Explorer_RefreshUI;
settings[cs].data = NULL;
settings[cs].data = 1;
settings[cs].hEvent = NULL;
settings[cs].hKey = NULL;
wcscpy_s(settings[cs].name, MAX_PATH, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced");
@ -8564,7 +8885,7 @@ DWORD Inject(BOOL bIsExplorer)
if (cs < numSettings)
{
settings[cs].callback = Explorer_RefreshUI;
settings[cs].data = NULL;
settings[cs].data = 2;
settings[cs].hEvent = NULL;
settings[cs].hKey = NULL;
wcscpy_s(settings[cs].name, MAX_PATH, L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Search");

View File

@ -434,6 +434,10 @@
;x 2 Automatic (fit contents) with threshold
;x 1 Fixed
"WeatherFixedSize"=dword:00000000
;c 2 Widget position
;x 0 Right / bottom (default)
;x 1 Left / top
"WeatherToLeft"=dword:00000000
;c 7 Update frequency
;x 60 Every minute
;x 300 Every 5 minutes
@ -469,6 +473,10 @@
;x 0 Microsoft (default)
;x 1 Google
"WeatherIconPack"=dword:00000000
;c 2 Display widget contents
;x 0 On a single line (default)
;x 1 On 2 lines, if possible
"WeatherContentsMode"=dword:00000000
;q
;t Weather data courtesy of Google, and weather.com.
;y Learn more about the Weather taskbar widget 🡕

View File

@ -374,6 +374,10 @@
;x 2 Automatic (fit contents) with threshold
;x 1 Fixed
"WeatherFixedSize"=dword:00000000
;c 2 Widget position
;x 0 Right / bottom (default)
;x 1 Left / top
"WeatherToLeft"=dword:00000000
;c 7 Update frequency
;x 60 Every minute
;x 300 Every 5 minutes
@ -408,6 +412,10 @@
;x 0 Microsoft (default)
;x 1 Google
"WeatherIconPack"=dword:00000000
;c 2 Display widget contents
;x 0 On a single line (default)
;x 1 On 2 lines, if possible
"WeatherContentsMode"=dword:00000000
;q
;t Weather data courtesy of Google, and weather.com.
;y Learn more about the Weather taskbar widget 🡕