diff --git a/include/psdk/winuser.h b/include/psdk/winuser.h index 4d8285138a3..e23d374fa74 100644 --- a/include/psdk/winuser.h +++ b/include/psdk/winuser.h @@ -1833,17 +1833,24 @@ extern "C" { #define WM_APP 32768 #define WM_GETTITLEBARINFOEX 0x033F -#define XBUTTON1 0x0001 -#define XBUTTON2 0x0002 - #if (_WIN32_WINNT >= 0x0400) #define WHEEL_DELTA 120 -#define GET_WHEEL_DELTA_WPARAM(wparam) ((short)HIWORD (wparam)) +#define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) #define WHEEL_PAGESCROLL UINT_MAX #endif + +#if (_WIN32_WINNT >= 0x0500) +#define GET_KEYSTATE_WPARAM(wParam) (LOWORD(wParam)) +#define GET_NCHITTEST_WPARAM(wParam) ((short)LOWORD(wParam)) +#define GET_XBUTTON_WPARAM(wParam) (HIWORD(wParam)) +#define XBUTTON1 0x0001 +#define XBUTTON2 0x0002 +#endif + #if (_WIN32_WINNT >= 0x0501) #define WM_THEMECHANGED 794 #endif + #define BM_CLICK 245 #define BM_GETCHECK 240 #define BM_GETIMAGE 246 diff --git a/win32ss/user/consrv/coninput.c b/win32ss/user/consrv/coninput.c index e8572638efa..83ee8371c7d 100644 --- a/win32ss/user/consrv/coninput.c +++ b/win32ss/user/consrv/coninput.c @@ -102,17 +102,17 @@ ConioProcessInputEvent(PCONSOLE Console, } static DWORD FASTCALL -ConioGetShiftState(PBYTE KeyState) +ConioGetShiftState(PBYTE KeyState, LPARAM lParam) { DWORD ssOut = 0; - if (KeyState[VK_CAPITAL] & 1) + if (KeyState[VK_CAPITAL] & 0x01) ssOut |= CAPSLOCK_ON; - if (KeyState[VK_NUMLOCK] & 1) + if (KeyState[VK_NUMLOCK] & 0x01) ssOut |= NUMLOCK_ON; - if (KeyState[VK_SCROLL] & 1) + if (KeyState[VK_SCROLL] & 0x01) ssOut |= SCROLLLOCK_ON; if (KeyState[VK_SHIFT] & 0x80) @@ -128,6 +128,10 @@ ConioGetShiftState(PBYTE KeyState) if (KeyState[VK_RMENU] & 0x80) ssOut |= RIGHT_ALT_PRESSED; + /* See WM_CHAR MSDN documentation for instance */ + if (lParam & 0x01000000) + ssOut |= ENHANCED_KEY; + return ssOut; } @@ -161,7 +165,7 @@ ConioProcessKey(PCONSOLE Console, MSG* msg) msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR; GetKeyboardState(KeyState); - ShiftState = ConioGetShiftState(KeyState); + ShiftState = ConioGetShiftState(KeyState, msg->lParam); if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) { diff --git a/win32ss/user/consrv/frontends/gui/guiterm.c b/win32ss/user/consrv/frontends/gui/guiterm.c index 09b50b248a5..9ff04a060d5 100644 --- a/win32ss/user/consrv/frontends/gui/guiterm.c +++ b/win32ss/user/consrv/frontends/gui/guiterm.c @@ -950,8 +950,10 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM else if (Console->InputBuffer.Mode & ENABLE_MOUSE_INPUT) { INPUT_RECORD er; - DWORD dwButtonState = 0; - DWORD dwEventFlags = 0; + WORD wKeyState = GET_KEYSTATE_WPARAM(wParam); + DWORD dwButtonState = 0; + DWORD dwControlKeyState = 0; + DWORD dwEventFlags = 0; switch (msg) { @@ -960,24 +962,39 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM dwEventFlags = 0; break; + case WM_MBUTTONDOWN: + dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED; + dwEventFlags = 0; + break; + + case WM_RBUTTONDOWN: + dwButtonState = RIGHTMOST_BUTTON_PRESSED; + dwEventFlags = 0; + break; + case WM_LBUTTONUP: dwButtonState = 0; dwEventFlags = 0; break; + case WM_MBUTTONUP: + dwButtonState = 0; + dwEventFlags = 0; + break; + + case WM_RBUTTONUP: + dwButtonState = 0; + dwEventFlags = 0; + break; + case WM_LBUTTONDBLCLK: dwButtonState = FROM_LEFT_1ST_BUTTON_PRESSED; dwEventFlags = DOUBLE_CLICK; break; - case WM_RBUTTONDOWN: - dwButtonState = RIGHTMOST_BUTTON_PRESSED; - dwEventFlags = 0; - break; - - case WM_RBUTTONUP: - dwButtonState = 0; - dwEventFlags = 0; + case WM_MBUTTONDBLCLK: + dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED; + dwEventFlags = DOUBLE_CLICK; break; case WM_RBUTTONDBLCLK: @@ -985,33 +1002,18 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM dwEventFlags = DOUBLE_CLICK; break; - case WM_MBUTTONDOWN: - dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED; - dwEventFlags = 0; - break; - - case WM_MBUTTONUP: - dwButtonState = 0; - dwEventFlags = 0; - break; - - case WM_MBUTTONDBLCLK: - dwButtonState = FROM_LEFT_2ND_BUTTON_PRESSED; - dwEventFlags = DOUBLE_CLICK; - break; - case WM_MOUSEMOVE: dwButtonState = 0; dwEventFlags = MOUSE_MOVED; break; case WM_MOUSEWHEEL: - dwButtonState = 0; + dwButtonState = GET_WHEEL_DELTA_WPARAM(wParam) << 16; dwEventFlags = MOUSE_WHEELED; break; case WM_MOUSEHWHEEL: - dwButtonState = 0; + dwButtonState = GET_WHEEL_DELTA_WPARAM(wParam) << 16; dwEventFlags = MOUSE_HWHEELED; break; @@ -1020,13 +1022,43 @@ GuiConsoleHandleMouse(PGUI_CONSOLE_DATA GuiData, UINT msg, WPARAM wParam, LPARAM break; } - er.EventType = MOUSE_EVENT; - er.Event.MouseEvent.dwMousePosition = PointToCoord(GuiData, lParam); - er.Event.MouseEvent.dwButtonState = dwButtonState; - er.Event.MouseEvent.dwControlKeyState = 0; - er.Event.MouseEvent.dwEventFlags = dwEventFlags; + if (Ret) + { + if (wKeyState & MK_LBUTTON) + dwButtonState |= FROM_LEFT_1ST_BUTTON_PRESSED; + if (wKeyState & MK_MBUTTON) + dwButtonState |= FROM_LEFT_2ND_BUTTON_PRESSED; + if (wKeyState & MK_RBUTTON) + dwButtonState |= RIGHTMOST_BUTTON_PRESSED; - ConioProcessInputEvent(Console, &er); + if (GetKeyState(VK_RMENU) & 0x8000) + dwControlKeyState |= RIGHT_ALT_PRESSED; + if (GetKeyState(VK_LMENU) & 0x8000) + dwControlKeyState |= LEFT_ALT_PRESSED; + if (GetKeyState(VK_RCONTROL) & 0x8000) + dwControlKeyState |= RIGHT_CTRL_PRESSED; + if (GetKeyState(VK_LCONTROL) & 0x8000) + dwControlKeyState |= LEFT_CTRL_PRESSED; + if (GetKeyState(VK_SHIFT) & 0x8000) + dwControlKeyState |= SHIFT_PRESSED; + if (GetKeyState(VK_NUMLOCK) & 0x0001) + dwControlKeyState |= NUMLOCK_ON; + if (GetKeyState(VK_SCROLL) & 0x0001) + dwControlKeyState |= SCROLLLOCK_ON; + if (GetKeyState(VK_CAPITAL) & 0x0001) + dwControlKeyState |= CAPSLOCK_ON; + /* See WM_CHAR MSDN documentation for instance */ + if (lParam & 0x01000000) + dwControlKeyState |= ENHANCED_KEY; + + er.EventType = MOUSE_EVENT; + er.Event.MouseEvent.dwMousePosition = PointToCoord(GuiData, lParam); + er.Event.MouseEvent.dwButtonState = dwButtonState; + er.Event.MouseEvent.dwControlKeyState = dwControlKeyState; + er.Event.MouseEvent.dwEventFlags = dwEventFlags; + + ConioProcessInputEvent(Console, &er); + } } LeaveCriticalSection(&Console->Lock); @@ -1425,14 +1457,14 @@ GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) break; case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_RBUTTONDBLCLK: case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + case WM_LBUTTONUP: case WM_MBUTTONUP: + case WM_RBUTTONUP: + case WM_LBUTTONDBLCLK: case WM_MBUTTONDBLCLK: + case WM_RBUTTONDBLCLK: case WM_MOUSEMOVE: case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: @@ -1693,7 +1725,7 @@ GuiInit(VOID) wc.cbSize = sizeof(WNDCLASSEXW); wc.lpszClassName = GUI_CONSOLE_WINDOW_CLASS; wc.lpfnWndProc = GuiConsoleWndProc; - wc.style = 0; + wc.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; wc.hInstance = ConSrvDllInstance; wc.hIcon = ghDefaultIcon; wc.hIconSm = ghDefaultIconSm;