Browse Source

Start: Implemented option to override monitor on which the menu opens when invoked via the keyboard

pull/886/head
Valentin Radu 4 years ago
parent
commit
46191733d7
  1. 64
      ExplorerPatcher/StartMenu.c
  2. 17
      ExplorerPatcher/settings.reg

64
ExplorerPatcher/StartMenu.c

@ -66,6 +66,29 @@ void OpenStartOnMonitor(HMONITOR monitor)
} }
} }
typedef struct _MonitorOverrideData
{
DWORD cbIndex;
DWORD dwIndex;
HMONITOR hMonitor;
} MonitorOverrideData;
BOOL ExtractMonitorByIndex(HMONITOR hMonitor, HDC hDC, LPRECT lpRect, MonitorOverrideData* mod)
{
POINT pt; pt.x = 0; pt.y = 0;
if (MonitorFromPoint(pt, MONITOR_DEFAULTTONULL) == hMonitor)
{
return TRUE;
}
if (mod->cbIndex == mod->dwIndex)
{
mod->hMonitor = hMonitor;
return FALSE;
}
mod->cbIndex++;
return TRUE;
}
LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook( LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook(
int code, int code,
WPARAM wParam, WPARAM wParam,
@ -78,7 +101,7 @@ LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook(
if (GetSystemMetrics(SM_CMONITORS) >= 2 && msg->message == WM_SYSCOMMAND && (msg->wParam & 0xFFF0) == SC_TASKLIST) if (GetSystemMetrics(SM_CMONITORS) >= 2 && msg->message == WM_SYSCOMMAND && (msg->wParam & 0xFFF0) == SC_TASKLIST)
{ {
printf("Position Start\n"); printf("Position Start\n");
if (bMonitorOverride) if (bMonitorOverride == 1)
{ {
goto finish; goto finish;
} }
@ -99,15 +122,36 @@ LRESULT CALLBACK OpenStartOnCurentMonitorThreadHook(
goto finish; goto finish;
}*/ }*/
DWORD pts = GetMessagePos(); HMONITOR monitor = NULL;
POINT pt; if (!bMonitorOverride)
pt.x = GET_X_LPARAM(pts); {
pt.y = GET_Y_LPARAM(pts); DWORD pts = GetMessagePos();
printf("!! %d %d\n", pt.x, pt.y); POINT pt;
HMONITOR monitor = MonitorFromPoint( pt.x = GET_X_LPARAM(pts);
pt, pt.y = GET_Y_LPARAM(pts);
MONITOR_DEFAULTTONULL printf("!! %d %d\n", pt.x, pt.y);
); monitor = MonitorFromPoint(
pt,
MONITOR_DEFAULTTONULL
);
}
else
{
MonitorOverrideData mod;
mod.cbIndex = 2;
mod.dwIndex = bMonitorOverride;
mod.hMonitor = NULL;
EnumDisplayMonitors(NULL, NULL, ExtractMonitorByIndex, &mod);
if (mod.hMonitor == NULL)
{
POINT pt; pt.x = 0; pt.y = 0;
monitor = MonitorFromPoint(pt, MONITOR_DEFAULTTOPRIMARY);
}
else
{
monitor = mod.hMonitor;
}
}
OpenStartOnMonitor(monitor); OpenStartOnMonitor(monitor);
msg->message = WM_NULL; msg->message = WM_NULL;

17
ExplorerPatcher/settings.reg

@ -169,8 +169,6 @@
;T Start menu ;T Start menu
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage] [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage]
;i Open Start on monitor containing the cursor
"MonitorOverride"=dword:00000001
;b Open Start at logon ;b Open Start at logon
"OpenAtLogon"=dword:00000000 "OpenAtLogon"=dword:00000000
;b Open Start in All apps by default ;b Open Start in All apps by default
@ -205,6 +203,21 @@
;x 0 Left ;x 0 Left
;x 1 Center (default) ;x 1 Center (default)
"TaskbarAl"=dword:00000001 "TaskbarAl"=dword:00000001
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\StartPage]
;a When using multiple displays, open Start on this monitor when invoked using
;c 10 the keyboard:
;x 1 Primary monitor (default)
;x 0 Monitor on which the cursor is on
;x 2 Monitor #2
;x 3 Monitor #3
;x 4 Monitor #4
;x 5 Monitor #5
;x 6 Monitor #6
;x 7 Monitor #7
;x 8 Monitor #8
;x 9 Monitor #9
"MonitorOverride"=dword:00000001
;a If the selected monitor is not available, Start will open on the primary display.
;T Window switcher ;T Window switcher

Loading…
Cancel
Save