reactos/modules/rostests/apitests/user32/GetKeyState.c
2022-04-26 03:38:29 +03:00

134 lines
4.3 KiB
C

/*
* PROJECT: ReactOS api tests
* LICENSE: GPL - See COPYING in the top level directory
* PURPOSE: Test for GetKeyState
* PROGRAMMERS: Giannis Adamopoulos
*/
#include "precomp.h"
static HHOOK hKbdHook, hKbdLLHook;
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
BOOL pressed = !(lParam & (1<<31));
BOOL altPressed = lParam & (1<<29);
if(pressed)
{
ok(altPressed,"\n");
ok((GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed\n");\
ok((GetKeyState(VK_LMENU) & 0x8000), "Left alt should not be pressed\n");\
}
else
{
ok(!altPressed,"\n");
ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed\n");
ok(!(GetKeyState(VK_LMENU) & 0x8000), "Left alt should be pressed\n");
}
return CallNextHookEx(hKbdHook, code, wParam, lParam);
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PKBDLLHOOKSTRUCT pLLHook = (PKBDLLHOOKSTRUCT)lParam;
if(wParam == WM_SYSKEYDOWN)
{
ok(pLLHook->flags & LLKHF_ALTDOWN,"Didn't get LLKHF_ALTDOWN flag\n");
ok((GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n");
ok(!(GetKeyState(VK_MENU) & 0x8000), "Alt should not be pressed in queue state\n");
ok(!(GetAsyncKeyState (VK_LMENU) & 0x8000), "Left alt should not be pressed in global kbd status\n");
ok(!(GetKeyState(VK_LMENU) & 0x8000), "Left alt should not be pressed in queue state\n");
}
else if(wParam == WM_SYSKEYUP)
{
ok(!(pLLHook->flags & LLKHF_ALTDOWN),"got LLKHF_ALTDOWN flag\n");
ok(!(GetAsyncKeyState (VK_MENU) & 0x8000), "Alt should not be pressed in global kbd status\n");
ok((GetKeyState(VK_MENU) & 0x8000), "Alt should be pressed in queue state\n");
ok(!(GetAsyncKeyState (VK_LMENU) & 0x8000), "Left alt should not be pressed in global kbd status\n");
ok((GetKeyState(VK_LMENU) & 0x8000), "Left alt should be pressed in queue state\n");
}
return CallNextHookEx(hKbdLLHook, nCode, wParam, lParam);
}
static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
if(msg == WM_SYSKEYDOWN)
{
ok(wParam == VK_MENU, "Got wrong wParam in WM_SYSKEYDOWN (%d instead of %d)\n", wParam, VK_MENU );
}
return DefWindowProcA( hWnd, msg, wParam, lParam );
}
static HWND CreateTestWindow()
{
MSG msg;
WNDCLASSA wclass;
HANDLE hInstance = GetModuleHandleA( NULL );
HWND hWndTest;
wclass.lpszClassName = "InputSysKeyTestClass";
wclass.style = CS_HREDRAW | CS_VREDRAW;
wclass.lpfnWndProc = WndProc;
wclass.hInstance = hInstance;
wclass.hIcon = LoadIconA( 0, IDI_APPLICATION );
wclass.hCursor = LoadCursorA( NULL, IDC_ARROW );
wclass.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
wclass.lpszMenuName = 0;
wclass.cbClsExtra = 0;
wclass.cbWndExtra = 0;
RegisterClassA( &wclass );
/* create the test window that will receive the keystrokes */
hWndTest = CreateWindowA( wclass.lpszClassName, "InputSysKeyTest",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, 100, 100,
NULL, NULL, hInstance, NULL);
assert( hWndTest );
ShowWindow( hWndTest, SW_SHOW);
SetWindowPos( hWndTest, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE );
SetForegroundWindow( hWndTest );
UpdateWindow( hWndTest);
/* flush pending messages */
while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
return hWndTest;
}
void Test_GetKeyState()
{
HWND hwnd;
MSG msg;
hwnd = CreateTestWindow();
hKbdHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandleA( NULL ), 0);
hKbdLLHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandleA( NULL ), 0);
ok(hKbdHook != NULL, "\n");
ok(hKbdLLHook != NULL, "\n");
keybd_event(VK_LMENU, 0, 0,0);
while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
keybd_event(VK_LMENU, 0, KEYEVENTF_KEYUP,0);
//fixme this hangs the test
//while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE|PM_NOYIELD )) DispatchMessageA( &msg );
DestroyWindow(hwnd);
while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
UnhookWindowsHookEx (hKbdHook);
UnhookWindowsHookEx (hKbdLLHook);
}
START_TEST(GetKeyState)
{
Test_GetKeyState();
}