[PATCH 1/3] dinput8/tests: Test injecting keyboard events.

Zhiyi Zhang zzhang at codeweavers.com
Fri Apr 10 01:54:56 CDT 2020



On 4/10/20 1:52 PM, Brendan Shanks wrote:
> Signed-off-by: Brendan Shanks <bshanks at codeweavers.com>
> ---
>  dlls/dinput8/tests/device.c | 107 ++++++++++++++++++++++++++++++++++++
>  1 file changed, 107 insertions(+)
>
> diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
> index f3e7b54235..a621a46229 100644
> --- a/dlls/dinput8/tests/device.c
> +++ b/dlls/dinput8/tests/device.c
> @@ -742,6 +742,112 @@ static void test_mouse_keyboard(void)
>      DestroyWindow(hwnd);
>  }
>  
> +static void test_keyboard_events(void)
> +{
> +    HRESULT hr;
> +    HWND hwnd = INVALID_HANDLE_VALUE;
> +    IDirectInput8A *di;
> +    IDirectInputDevice8A *di_keyboard;
> +    DIPROPDWORD dp;
> +    DIDEVICEOBJECTDATA obj_data[10];
> +    DWORD data_size;
> +    BYTE kbdata[256];
> +
> +    hwnd = CreateWindowExA(WS_EX_TOPMOST, "static", "dinput", WS_POPUP | WS_VISIBLE, 0, 0, 100, 100, NULL, NULL, NULL, NULL);
> +    ok(hwnd != NULL, "CreateWindowExA failed\n");
> +
> +    hr = CoCreateInstance(&CLSID_DirectInput8, 0, CLSCTX_INPROC_SERVER, &IID_IDirectInput8A, (LPVOID*)&di);
> +    if (hr == DIERR_OLDDIRECTINPUTVERSION ||
> +        hr == DIERR_BETADIRECTINPUTVERSION ||
> +        hr == REGDB_E_CLASSNOTREG)
> +    {
> +        win_skip("test_keyboard_events requires dinput8\n");
hwnd is leaked.
> +        return;
> +    }
> +    ok(SUCCEEDED(hr), "DirectInput8Create failed: %08x\n", hr);
> +
> +    hr = IDirectInput8_Initialize(di, GetModuleHandleA(NULL), DIRECTINPUT_VERSION);
> +    if (hr == DIERR_OLDDIRECTINPUTVERSION || hr == DIERR_BETADIRECTINPUTVERSION)
> +    {
> +        win_skip("test_keyboard_events requires dinput8\n");
> +        return;
> +    }
> +    ok(SUCCEEDED(hr), "IDirectInput8_Initialize failed: %08x\n", hr);
> +
> +    hr = IDirectInput8_CreateDevice(di, &GUID_SysKeyboard, &di_keyboard, NULL);
> +    ok(SUCCEEDED(hr), "IDirectInput8_CreateDevice failed: %08x\n", hr);
> +    hr = IDirectInputDevice8_SetCooperativeLevel(di_keyboard, hwnd, DISCL_BACKGROUND | DISCL_NONEXCLUSIVE);
> +    ok(SUCCEEDED(hr), "IDirectInput8_SetCooperativeLevel failed: %08x\n", hr);
> +    hr = IDirectInputDevice8_SetDataFormat(di_keyboard, &c_dfDIKeyboard);
> +    ok(SUCCEEDED(hr), "IDirectInputDevice8_SetDataFormat failed: %08x\n", hr);
> +    dp.diph.dwSize = sizeof(DIPROPDWORD);
> +    dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
> +    dp.diph.dwObj = 0;
> +    dp.diph.dwHow = DIPH_DEVICE;
> +    dp.dwData = ARRAY_SIZE(obj_data);
> +    IDirectInputDevice8_SetProperty(di_keyboard, DIPROP_BUFFERSIZE, &(dp.diph));
> +
> +    hr = IDirectInputDevice8_Acquire(di_keyboard);
> +    ok(SUCCEEDED(hr), "IDirectInputDevice8_Acquire failed: %08x\n", hr);
> +
> +    /* Test injecting keyboard events with both VK and scancode given. */
> +    keybd_event(VK_SPACE, DIK_SPACE, 0, 0);
> +    flush_events();
> +    IDirectInputDevice8_Poll(di_keyboard);
> +    data_size = ARRAY_SIZE(obj_data);
> +    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0);
> +    ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr);
> +    todo_wine
> +    ok(data_size == 1, "Expected 1 element, received %d\n", data_size);
> +
> +    hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(kbdata), kbdata);
> +    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState failed: %08x\n", hr);
> +    todo_wine
> +    ok(kbdata[DIK_SPACE], "Expected DIK_SPACE key state down\n");
> +
> +    keybd_event(VK_SPACE, DIK_SPACE, KEYEVENTF_KEYUP, 0);
> +    flush_events();
> +    IDirectInputDevice8_Poll(di_keyboard);
> +    data_size = ARRAY_SIZE(obj_data);
> +    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0);
> +    ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr);
> +    todo_wine
> +    ok(data_size == 1, "Expected 1 element, received %d\n", data_size);
> +
> +    /* Test injecting keyboard events with scancode=0.
> +     * Windows DInput ignores the VK, sets scancode 0 to be pressed, and GetDeviceData returns no elements. */
> +    keybd_event(VK_SPACE, 0, 0, 0);
> +    flush_events();
> +    IDirectInputDevice8_Poll(di_keyboard);
> +    data_size = ARRAY_SIZE(obj_data);
> +    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0);
> +    ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr);
> +    todo_wine
> +    ok(data_size == 0, "Expected 0 elements, received %d\n", data_size);
> +
> +    hr = IDirectInputDevice8_GetDeviceState(di_keyboard, sizeof(kbdata), kbdata);
> +    ok(SUCCEEDED(hr), "IDirectInputDevice8_GetDeviceState failed: %08x\n", hr);
> +    todo_wine
> +    ok(kbdata[0], "Expected key 0 state down\n");
> +
> +    keybd_event(VK_SPACE, 0, KEYEVENTF_KEYUP, 0);
> +    flush_events();
> +    IDirectInputDevice8_Poll(di_keyboard);
> +    data_size = ARRAY_SIZE(obj_data);
> +    hr = IDirectInputDevice8_GetDeviceData(di_keyboard, sizeof(DIDEVICEOBJECTDATA), obj_data, &data_size, 0);
> +    ok(SUCCEEDED(hr), "Failed to get data hr=%08x\n", hr);
> +    todo_wine
> +    ok(data_size == 0, "Expected 0 elements, received %d\n", data_size);
> +
> +    hr = IDirectInputDevice8_Unacquire(di_keyboard);
> +    ok(SUCCEEDED(hr), "IDirectInputDevice8_Unacquire failed: %08x\n", hr);
> +
> +    IDirectInputDevice8_Release(di_keyboard);
> +    IDirectInput8_Release(di);
> +
> +    DestroyWindow(hwnd);
> +}
> +
>  START_TEST(device)
>  {
>      CoInitialize(NULL);
> @@ -749,6 +855,7 @@ START_TEST(device)
>      test_action_mapping();
>      test_save_settings();
>      test_mouse_keyboard();
> +    test_keyboard_events();
>  
>      CoUninitialize();
>  }




More information about the wine-devel mailing list