diff --git a/rostests/apitests/user32/GetKeyState.c b/rostests/apitests/user32/GetKeyState.c new file mode 100644 index 00000000000..8bc2b9959d8 --- /dev/null +++ b/rostests/apitests/user32/GetKeyState.c @@ -0,0 +1,127 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for GetKeyState + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include +#include +#include +#include + +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"); + } + else + { + ok(!altPressed,"\n"); + ok(!(GetKeyState(VK_MENU) & 0x8000), "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"); + } + 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"); + } + + return CallNextHookEx(hKbdLLHook, nCode, wParam, lParam); +} + +static LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) +{ + 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_MENU, 0, 0,0); + + while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + + keybd_event(VK_MENU, 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(); +} \ No newline at end of file diff --git a/rostests/apitests/user32/SetCursorPos.c b/rostests/apitests/user32/SetCursorPos.c new file mode 100644 index 00000000000..8896f986f26 --- /dev/null +++ b/rostests/apitests/user32/SetCursorPos.c @@ -0,0 +1,41 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPL - See COPYING in the top level directory + * PURPOSE: Test for SetCursorPos + * PROGRAMMERS: Giannis Adamopoulos + */ + +#include +#include +#include +#include + +HHOOK hMouseHook; +int hook_calls = 0; + +LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + hook_calls++; + return CallNextHookEx(hMouseHook, nCode, wParam, lParam); +} + +void Test_SetCursorPos() +{ + hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandleA( NULL ), 0); + ok(hMouseHook!=NULL,"failed to set hook\n"); + + /* try SetCursorPos */ + SetCursorPos(0,0); + ok (hook_calls == 0, "hooks shouldn't be called\n"); + + /* try mouse_event with MOUSEEVENTF_MOVE*/ + mouse_event(MOUSEEVENTF_MOVE, 100,100, 0,0); + ok (hook_calls == 1, "hooks should have been called\n"); + + UnhookWindowsHookEx (hMouseHook); +} + +START_TEST(SetCursorPos) +{ + Test_SetCursorPos(); +} \ No newline at end of file diff --git a/rostests/apitests/user32/testlist.c b/rostests/apitests/user32/testlist.c index f89be66ed15..cb95521ee22 100644 --- a/rostests/apitests/user32/testlist.c +++ b/rostests/apitests/user32/testlist.c @@ -13,6 +13,8 @@ extern void func_GetSystemMetrics(void); extern void func_GetIconInfo(void); extern void func_GetPeekMessage(void); extern void func_DeferWindowPos(void); +extern void func_GetKeyState(void); +extern void func_SetCursorPos(void); const struct test winetest_testlist[] = { @@ -24,7 +26,8 @@ const struct test winetest_testlist[] = { "GetIconInfo", func_GetIconInfo }, { "GetPeekMessage", func_GetPeekMessage }, { "DeferWindowPos", func_DeferWindowPos }, - + { "GetKeyState", func_GetKeyState }, + { "SetCursorPos", func_SetCursorPos }, { 0, 0 } }; diff --git a/rostests/apitests/user32/user32_apitest.rbuild b/rostests/apitests/user32/user32_apitest.rbuild index 6f5489c31d2..e703e7905ca 100644 --- a/rostests/apitests/user32/user32_apitest.rbuild +++ b/rostests/apitests/user32/user32_apitest.rbuild @@ -10,6 +10,7 @@ testlist.c user32_apitest.rc + GetKeyState.c InitializeLpkHooks.c RealGetWindowClass.c ScrollDC.c @@ -18,6 +19,7 @@ GetIconInfo.c GetPeekMessage.c DeferWindowPos.c + SetCursorPos.c