Browse Source

System tray menus toggle when clicked and open centered

pull/51/head
Valentin Radu 4 years ago
parent
commit
ab18b84641
  1. 313
      ExplorerPatcher/dllmain.c

313
ExplorerPatcher/dllmain.c

@ -40,6 +40,10 @@ @@ -40,6 +40,10 @@
#define SB_TRACKPOPUPMENUEX_HOOK 0x1CB18 // 0x21920
#define SB_LOADIMAGEW_HOOK 0x3BEB0 // 0x4A6F0
#define CHECKFOREGROUNDELAPSED_TIMEOUT 100
#define POPUPMENU_SAFETOREMOVE_TIMEOUT 300
#define POPUPMENU_BLUETOOTH_TIMEOUT 700
HWND archivehWnd;
HMODULE hStartIsBack64 = 0;
BOOL bHideExplorerSearchBar = FALSE;
@ -49,9 +53,12 @@ BOOL bSkinMenus = TRUE; @@ -49,9 +53,12 @@ BOOL bSkinMenus = TRUE;
BOOL bSkinIcons = TRUE;
HMODULE hModule = NULL;
HANDLE hIsWinXShown = NULL;
HANDLE hWinXThread = NULL;
#pragma region "Generics"
#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))
#define MAX(X, Y) (((X) > (Y)) ? (X) : (Y))
static HWND(WINAPI* CreateWindowInBand)(
_In_ DWORD dwExStyle,
_In_opt_ ATOM atom,
@ -77,11 +84,108 @@ static BOOL(*ShouldAppsUseDarkMode)(); @@ -77,11 +84,108 @@ static BOOL(*ShouldAppsUseDarkMode)();
static void(*GetThemeName)(void*, void*, void*);
static BOOL AppsShouldUseDarkMode() { return TRUE; }
long long milliseconds_now() {
LARGE_INTEGER s_frequency;
BOOL s_use_qpc = QueryPerformanceFrequency(&s_frequency);
if (s_use_qpc) {
LARGE_INTEGER now;
QueryPerformanceCounter(&now);
return (1000LL * now.QuadPart) / s_frequency.QuadPart;
}
else {
return GetTickCount();
}
}
HWND GetMonitorInfoFromPointForTaskbarFlyoutActivation(POINT ptCursor, DWORD dwFlags, LPMONITORINFO lpMi)
{
HMONITOR hMonitor = MonitorFromPoint(ptCursor, dwFlags);
HWND hWnd = NULL;
do
{
hWnd = FindWindowEx(
NULL,
hWnd,
L"Shell_SecondaryTrayWnd",
NULL
);
if (MonitorFromWindow(hWnd, dwFlags) == hMonitor)
{
if (lpMi)
{
GetMonitorInfo(
MonitorFromPoint(
ptCursor,
dwFlags
),
lpMi
);
}
break;
}
} while (hWnd);
if (!hWnd)
{
hWnd = FindWindowEx(
NULL,
NULL,
L"Shell_TrayWnd",
NULL
);
ptCursor.x = 0;
ptCursor.y = 0;
if (lpMi)
{
GetMonitorInfo(
MonitorFromPoint(
ptCursor,
dwFlags
),
lpMi
);
}
}
return hWnd;
}
long long elapsedCheckForeground = 0;
HANDLE hCheckForegroundThread = NULL;
DWORD CheckForegroundThread(wchar_t* wszClassName)
{
printf("Started \"Check foreground window\" thread.\n");
UINT i = 0;
while (TRUE)
{
wchar_t text[200];
GetClassNameW(GetForegroundWindow(), text, 200);
if (!wcscmp(text, wszClassName))
{
break;
}
i++;
if (i >= 15) break;
Sleep(100);
}
while (TRUE)
{
wchar_t text[200];
GetClassNameW(GetForegroundWindow(), text, 200);
if (wcscmp(text, wszClassName))
{
break;
}
Sleep(100);
}
elapsedCheckForeground = milliseconds_now();
printf("Ended \"Check foreground window\" thread.\n");
return 0;
}
#pragma endregion
#pragma region "twinui.pcshell.dll hooks"
#define CLASS_NAME L"LauncherTipWnd"
#define LAUNCHERTIP_CLASS_NAME L"LauncherTipWnd"
static INT64(*winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageFunc)(
void* _this,
INT64 a2,
@ -231,13 +335,13 @@ DWORD ShowLauncherTipContextMenu( @@ -231,13 +335,13 @@ DWORD ShowLauncherTipContextMenu(
wc.lpfnWndProc = CLauncherTipContextMenu_WndProc;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hInstance = GetModuleHandle(NULL);
wc.lpszClassName = CLASS_NAME;
wc.lpszClassName = LAUNCHERTIP_CLASS_NAME;
wc.hCursor = LoadCursorW(NULL, IDC_ARROW);
RegisterClass(&wc);
hWinXWnd = CreateWindowInBand(
0,
CLASS_NAME,
LAUNCHERTIP_CLASS_NAME,
0,
WS_POPUP,
0,
@ -375,6 +479,13 @@ INT64 CLauncherTipContextMenu_ShowLauncherTipContextMenuHook( @@ -375,6 +479,13 @@ INT64 CLauncherTipContextMenu_ShowLauncherTipContextMenuHook(
POINT* pt
)
{
if (hWinXThread)
{
WaitForSingleObject(hWinXThread, INFINITE);
CloseHandle(hWinXThread);
hWinXThread = NULL;
}
if (hIsWinXShown)
{
goto finalize;
@ -482,10 +593,51 @@ INT64 CLauncherTipContextMenu_ShowLauncherTipContextMenuHook( @@ -482,10 +593,51 @@ INT64 CLauncherTipContextMenu_ShowLauncherTipContextMenuHook(
0,
0
);
hWinXThread = hIsWinXShown;
finalize:
return CLauncherTipContextMenu_ShowLauncherTipContextMenuFunc(_this, pt);
}
#pragma endregion
#pragma region "Popup menu hooks"
#define TB_POS_NOWHERE 0
#define TB_POS_BOTTOM 1
#define TB_POS_TOP 2
#define TB_POS_LEFT 3
#define TB_POS_RIGHT 4
UINT GetTaskbarLocationAndSize(POINT ptCursor, RECT* rc)
{
MONITORINFO mi;
mi.cbSize = sizeof(MONITORINFO);
HWND hWnd = GetMonitorInfoFromPointForTaskbarFlyoutActivation(
ptCursor,
MONITOR_DEFAULTTOPRIMARY,
&mi
);
if (hWnd)
{
GetWindowRect(hWnd, rc);
if (rc->left < 5 && rc->top > 5)
{
return TB_POS_BOTTOM;
}
else if (rc->left < 5 && rc->top < 5 && rc->right > rc->bottom)
{
return TB_POS_TOP;
}
else if (rc->left < 5 && rc->top < 5 && rc->right < rc->bottom)
{
return TB_POS_LEFT;
}
else if (rc->left > 5 && rc->top < 5)
{
return TB_POS_RIGHT;
}
}
return TB_POS_NOWHERE;
}
INT64 OwnerDrawSubclassProc(
_In_ HWND hWnd,
@ -515,10 +667,34 @@ INT64 OwnerDrawSubclassProc( @@ -515,10 +667,34 @@ INT64 OwnerDrawSubclassProc(
lParam
);
}
#pragma endregion
#pragma region "Popup menu hooks"
void PopupMenuAdjustCoordinatesAndFlags(int* x, int* y, UINT* uFlags)
{
POINT pt;
GetCursorPos(&pt);
RECT rc;
UINT tbPos = GetTaskbarLocationAndSize(pt, &rc);
if (tbPos == TB_POS_BOTTOM)
{
*y = MIN(*y, rc.top);
*uFlags |= TPM_CENTERALIGN | TPM_BOTTOMALIGN;
}
else if (tbPos == TB_POS_TOP)
{
*y = MAX(*y, rc.bottom);
*uFlags |= TPM_CENTERALIGN | TPM_TOPALIGN;
}
else if (tbPos == TB_POS_LEFT)
{
*x = MAX(*x, rc.right);
*uFlags |= TPM_VCENTERALIGN | TPM_LEFTALIGN;
}
if (tbPos == TB_POS_RIGHT)
{
*x = MIN(*x, rc.left);
*uFlags |= TPM_VCENTERALIGN | TPM_RIGHTALIGN;
}
}
long long TrackPopupMenuElapsed = 0;
BOOL TrackPopupMenuHook(
HMENU hMenu,
UINT uFlags,
@ -529,6 +705,11 @@ BOOL TrackPopupMenuHook( @@ -529,6 +705,11 @@ BOOL TrackPopupMenuHook(
const RECT* prcRect
)
{
long long elapsed = milliseconds_now() - TrackPopupMenuElapsed;
BOOL b = FALSE;
if (elapsed > POPUPMENU_SAFETOREMOVE_TIMEOUT)
{
PopupMenuAdjustCoordinatesAndFlags(&x, &y, &uFlags);
INT64* unknown_array = calloc(4, sizeof(INT64));
POINT pt;
pt.x = x;
@ -541,7 +722,7 @@ BOOL TrackPopupMenuHook( @@ -541,7 +722,7 @@ BOOL TrackPopupMenuHook(
unknown_array
);
SetWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc, 0);
BOOL b = TrackPopupMenu(
b = TrackPopupMenu(
hMenu,
uFlags | TPM_RIGHTBUTTON,
x,
@ -550,6 +731,7 @@ BOOL TrackPopupMenuHook( @@ -550,6 +731,7 @@ BOOL TrackPopupMenuHook(
hWnd,
prcRect
);
TrackPopupMenuElapsed = milliseconds_now();
RemoveWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc);
ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc(
hMenu,
@ -557,8 +739,10 @@ BOOL TrackPopupMenuHook( @@ -557,8 +739,10 @@ BOOL TrackPopupMenuHook(
&(pt)
);
free(unknown_array);
}
return b;
}
long long TrackPopupMenuExElapsed = 0;
BOOL TrackPopupMenuExHook(
HMENU hMenu,
UINT uFlags,
@ -568,6 +752,11 @@ BOOL TrackPopupMenuExHook( @@ -568,6 +752,11 @@ BOOL TrackPopupMenuExHook(
LPTPMPARAMS lptpm
)
{
long long elapsed = milliseconds_now() - TrackPopupMenuExElapsed;
BOOL b = FALSE;
if (elapsed > POPUPMENU_BLUETOOTH_TIMEOUT)
{
PopupMenuAdjustCoordinatesAndFlags(&x, &y, &uFlags);
INT64* unknown_array = calloc(4, sizeof(INT64));
POINT pt;
pt.x = x;
@ -580,7 +769,7 @@ BOOL TrackPopupMenuExHook( @@ -580,7 +769,7 @@ BOOL TrackPopupMenuExHook(
unknown_array
);
SetWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc, 0);
BOOL b = TrackPopupMenuEx(
b = TrackPopupMenuEx(
hMenu,
uFlags | TPM_RIGHTBUTTON,
x,
@ -588,6 +777,7 @@ BOOL TrackPopupMenuExHook( @@ -588,6 +777,7 @@ BOOL TrackPopupMenuExHook(
hWnd,
lptpm
);
TrackPopupMenuExElapsed = milliseconds_now();
RemoveWindowSubclass(hWnd, OwnerDrawSubclassProc, OwnerDrawSubclassProc);
ImmersiveContextMenuHelper_RemoveOwnerDrawFromMenuFunc(
hMenu,
@ -595,6 +785,7 @@ BOOL TrackPopupMenuExHook( @@ -595,6 +785,7 @@ BOOL TrackPopupMenuExHook(
&(pt)
);
free(unknown_array);
}
return b;
}
#pragma endregion
@ -671,6 +862,14 @@ HRESULT pnidui_CoCreateInstanceHook( @@ -671,6 +862,14 @@ HRESULT pnidui_CoCreateInstanceHook(
{
if (IsEqualGUID(rclsid, &GUID_c2f03a33_21f5_47fa_b4bb_156362a2f239) &&
IsEqualGUID(riid, &GUID_6d5140c1_7436_11ce_8034_00aa006009fa))
{
if (hCheckForegroundThread)
{
WaitForSingleObject(hCheckForegroundThread, INFINITE);
CloseHandle(hCheckForegroundThread);
hCheckForegroundThread = NULL;
}
if (milliseconds_now() - elapsedCheckForeground > CHECKFOREGROUNDELAPSED_TIMEOUT)
{
ShellExecute(
NULL,
@ -680,6 +879,15 @@ HRESULT pnidui_CoCreateInstanceHook( @@ -680,6 +879,15 @@ HRESULT pnidui_CoCreateInstanceHook(
NULL,
SW_SHOWNORMAL
);
hCheckForegroundThread = CreateThread(
0,
0,
CheckForegroundThread,
L"Windows.UI.Core.CoreWindow",
0,
0
);
}
/*PostMessageW(
FindWindowEx(
NULL,
@ -705,57 +913,6 @@ HRESULT pnidui_CoCreateInstanceHook( @@ -705,57 +913,6 @@ HRESULT pnidui_CoCreateInstanceHook(
#pragma region "Show Clock flyout on Win+C"
HWND GetMonitorInfoFromPointForTaskbarFlyoutActivation(POINT ptCursor, DWORD dwFlags, LPMONITORINFO lpMi)
{
HMONITOR hMonitor = MonitorFromPoint(ptCursor, dwFlags);
HWND hWnd = NULL;
do
{
hWnd = FindWindowEx(
NULL,
hWnd,
L"Shell_SecondaryTrayWnd",
NULL
);
if (MonitorFromWindow(hWnd, dwFlags) == hMonitor)
{
if (lpMi)
{
GetMonitorInfo(
MonitorFromPoint(
ptCursor,
dwFlags
),
lpMi
);
}
break;
}
} while (hWnd);
if (!hWnd)
{
hWnd = FindWindowEx(
NULL,
NULL,
L"Shell_TrayWnd",
NULL
);
ptCursor.x = 0;
ptCursor.y = 0;
if (lpMi)
{
GetMonitorInfo(
MonitorFromPoint(
ptCursor,
dwFlags
),
lpMi
);
}
}
return hWnd;
}
INT64 winrt_Windows_Internal_Shell_implementation_MeetAndChatManager_OnMessageHook(
void* _this,
INT64 a2,
@ -1325,14 +1482,7 @@ __declspec(dllexport) DWORD WINAPI main( @@ -1325,14 +1482,7 @@ __declspec(dllexport) DWORD WINAPI main(
);
hStartIsBack64 = LoadLibraryW(wszSBPath);
free(wszSBPath);
if (hStartIsBack64)
{
((void(*)())((uintptr_t)hStartIsBack64 + SB_INIT1))();
((void(*)())((uintptr_t)hStartIsBack64 + SB_INIT2))();
printf("Loaded and initialized StartIsBack64 DLL\n");
}
@ -1488,6 +1638,17 @@ __declspec(dllexport) DWORD WINAPI main( @@ -1488,6 +1638,17 @@ __declspec(dllexport) DWORD WINAPI main(
if (hStartIsBack64)
{
((void(*)())((uintptr_t)hStartIsBack64 + SB_INIT1))();
((void(*)())((uintptr_t)hStartIsBack64 + SB_INIT2))();
printf("Loaded and initialized StartIsBack64 DLL\n");
}
HANDLE hEvent = CreateEventEx(
0,
L"ShellDesktopSwitchEvent",
@ -1616,6 +1777,19 @@ __declspec(dllexport) DWORD WINAPI main( @@ -1616,6 +1777,19 @@ __declspec(dllexport) DWORD WINAPI main(
return 0;
}
char VisibilityChangedEventArguments_GetVisible(__int64 a1)
{
int v1;
char v3[8];
ZeroMemory(v3, 8);
v1 = (*(__int64(__fastcall**)(__int64, char*))(*(INT64*)a1 + 48))(a1, v3);
if (v1 < 0)
return 0;
return v3[0];
}
static INT64(*StartDocked_LauncherFrame_OnVisibilityChangedFunc)(void*, INT64, void*);
static INT64(*StartDocked_LauncherFrame_ShowAllAppsFunc)(void* _this);
@ -1641,10 +1815,13 @@ INT64 StartDocked_LauncherFrame_OnVisibilityChangedHook(void* _this, INT64 a2, v @@ -1641,10 +1815,13 @@ INT64 StartDocked_LauncherFrame_OnVisibilityChangedHook(void* _this, INT64 a2, v
}
FreeLibrary(hModule);
if (dwStatus)
{
//if (VisibilityChangedEventArguments_GetVisible(VisibilityChangedEventArguments))
{
StartDocked_LauncherFrame_ShowAllAppsFunc(_this);
}
}
}
return r;
}

Loading…
Cancel
Save