[WINLOGON] Register hotkeys for 'Lock Workstation' and 'Accessibility' (UtilMan) (#8083)

- The hotkeys are respectively: Win+L and Win+U .
- Use instead the hotkey IDs in the WM_HOTKEY handler.
This commit is contained in:
Hermès Bélusca-Maïto 2019-06-16 19:17:36 +02:00
parent dfe30e58c0
commit fbd676f4c9
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
2 changed files with 54 additions and 14 deletions

View file

@ -26,8 +26,10 @@
#define WINLOGON_SAS_CLASS L"SAS Window class" #define WINLOGON_SAS_CLASS L"SAS Window class"
#define WINLOGON_SAS_TITLE L"SAS window" #define WINLOGON_SAS_TITLE L"SAS window"
#define HK_CTRL_ALT_DEL 0 #define IDHK_CTRL_ALT_DEL 0
#define HK_CTRL_SHIFT_ESC 1 #define IDHK_CTRL_SHIFT_ESC 1
#define IDHK_WIN_L 2
#define IDHK_WIN_U 3
// #define EWX_FLAGS_MASK 0x00000014 // #define EWX_FLAGS_MASK 0x00000014
// #define EWX_ACTION_MASK ~EWX_FLAGS_MASK // #define EWX_ACTION_MASK ~EWX_FLAGS_MASK
@ -1246,17 +1248,28 @@ RegisterHotKeys(
IN PWLSESSION Session, IN PWLSESSION Session,
IN HWND hwndSAS) IN HWND hwndSAS)
{ {
/* Register Ctrl+Alt+Del Hotkey */ /* Register Ctrl+Alt+Del hotkey */
if (!RegisterHotKey(hwndSAS, HK_CTRL_ALT_DEL, MOD_CONTROL | MOD_ALT, VK_DELETE)) if (!RegisterHotKey(hwndSAS, IDHK_CTRL_ALT_DEL, MOD_CONTROL | MOD_ALT, VK_DELETE))
{ {
ERR("WL: Unable to register Ctrl+Alt+Del hotkey!\n"); ERR("WL: Unable to register Ctrl+Alt+Del hotkey\n");
return FALSE; return FALSE;
} }
/* Register Ctrl+Shift+Esc (optional) */ /* Register Ctrl+Shift+Esc "Task Manager" hotkey (optional) */
Session->TaskManHotkey = RegisterHotKey(hwndSAS, HK_CTRL_SHIFT_ESC, MOD_CONTROL | MOD_SHIFT, VK_ESCAPE); Session->TaskManHotkey = RegisterHotKey(hwndSAS, IDHK_CTRL_SHIFT_ESC, MOD_CONTROL | MOD_SHIFT, VK_ESCAPE);
if (!Session->TaskManHotkey) if (!Session->TaskManHotkey)
WARN("WL: Warning: Unable to register Ctrl+Alt+Esc hotkey!\n"); WARN("WL: Unable to register Ctrl+Shift+Esc hotkey\n");
/* Register Win+L "Lock Workstation" hotkey (optional) */
Session->LockWkStaHotkey = RegisterHotKey(hwndSAS, IDHK_WIN_L, MOD_WIN, 'L');
if (!Session->LockWkStaHotkey)
WARN("WL: Unable to register Win+L hotkey\n");
/* Register Win+U "Accessibility Utility" hotkey (optional) */
Session->UtilManHotkey = RegisterHotKey(hwndSAS, IDHK_WIN_U, MOD_WIN, 'U');
if (!Session->UtilManHotkey)
WARN("WL: Unable to register Win+U hotkey\n");
return TRUE; return TRUE;
} }
@ -1266,11 +1279,17 @@ UnregisterHotKeys(
IN PWLSESSION Session, IN PWLSESSION Session,
IN HWND hwndSAS) IN HWND hwndSAS)
{ {
/* Unregister hotkeys */ /* Unregister the hotkeys */
UnregisterHotKey(hwndSAS, HK_CTRL_ALT_DEL); UnregisterHotKey(hwndSAS, IDHK_CTRL_ALT_DEL);
if (Session->TaskManHotkey) if (Session->TaskManHotkey)
UnregisterHotKey(hwndSAS, HK_CTRL_SHIFT_ESC); UnregisterHotKey(hwndSAS, IDHK_CTRL_SHIFT_ESC);
if (Session->LockWkStaHotkey)
UnregisterHotKey(hwndSAS, IDHK_WIN_L);
if (Session->UtilManHotkey)
UnregisterHotKey(hwndSAS, IDHK_WIN_U);
return TRUE; return TRUE;
} }
@ -1326,9 +1345,9 @@ SASWindowProc(
{ {
case WM_HOTKEY: case WM_HOTKEY:
{ {
switch (lParam) switch (wParam)
{ {
case MAKELONG(MOD_CONTROL | MOD_ALT, VK_DELETE): case IDHK_CTRL_ALT_DEL:
{ {
TRACE("SAS: CONTROL+ALT+DELETE\n"); TRACE("SAS: CONTROL+ALT+DELETE\n");
if (!Session->Gina.UseCtrlAltDelete) if (!Session->Gina.UseCtrlAltDelete)
@ -1336,13 +1355,25 @@ SASWindowProc(
PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_CTRL_ALT_DEL, 0); PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_CTRL_ALT_DEL, 0);
return TRUE; return TRUE;
} }
case MAKELONG(MOD_CONTROL | MOD_SHIFT, VK_ESCAPE): case IDHK_CTRL_SHIFT_ESC:
{ {
TRACE("SAS: CONTROL+SHIFT+ESCAPE\n"); TRACE("SAS: CONTROL+SHIFT+ESCAPE\n");
if (Session->LogonState == STATE_LOGGED_ON) if (Session->LogonState == STATE_LOGGED_ON)
DoGenericAction(Session, WLX_SAS_ACTION_TASKLIST); DoGenericAction(Session, WLX_SAS_ACTION_TASKLIST);
return TRUE; return TRUE;
} }
case IDHK_WIN_L:
{
TRACE("SAS: WIN+L\n");
PostMessageW(Session->SASWindow, WM_LOGONNOTIFY, LN_LOCK_WORKSTATION, 0);
return TRUE;
}
case IDHK_WIN_U:
{
TRACE("SAS: WIN+U\n");
// PostMessageW(Session->SASWindow, WM_LOGONNOTIFY, LN_ACCESSIBILITY, 0);
return TRUE;
}
} }
break; break;
} }
@ -1397,6 +1428,13 @@ SASWindowProc(
DispatchSAS(Session, WLX_SAS_TYPE_SCRNSVR_TIMEOUT); DispatchSAS(Session, WLX_SAS_TYPE_SCRNSVR_TIMEOUT);
break; break;
} }
#if 0
case LN_ACCESSIBILITY:
{
ERR("LN_ACCESSIBILITY(lParam = %lu)\n", lParam);
break;
}
#endif
case LN_LOCK_WORKSTATION: case LN_LOCK_WORKSTATION:
{ {
DoGenericAction(Session, WLX_SAS_ACTION_LOCK_WKSTA); DoGenericAction(Session, WLX_SAS_ACTION_LOCK_WKSTA);

View file

@ -223,6 +223,8 @@ typedef struct _WLSESSION
DWORD SASAction; DWORD SASAction;
BOOL SuppressStatus; BOOL SuppressStatus;
BOOL TaskManHotkey; BOOL TaskManHotkey;
BOOL LockWkStaHotkey;
BOOL UtilManHotkey;
HWND SASWindow; HWND SASWindow;
HWINSTA InteractiveWindowStation; HWINSTA InteractiveWindowStation;
LPWSTR InteractiveWindowStationName; LPWSTR InteractiveWindowStationName;