Rémi Bernon : user32: Implement SendInput INPUT_HARDWARE check.

Alexandre Julliard julliard at winehq.org
Wed Apr 14 16:01:20 CDT 2021


Module: wine
Branch: master
Commit: 092c7a09a5afde3f11b71b1816388e80d062e8ec
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=092c7a09a5afde3f11b71b1816388e80d062e8ec

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Apr  9 13:11:32 2021 +0200

user32: Implement SendInput INPUT_HARDWARE check.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=50506
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/user32/input.c       | 14 ++++++++++----
 dlls/user32/tests/input.c | 10 ++++------
 2 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/dlls/user32/input.c b/dlls/user32/input.c
index 22e53585f00..7cf7e53a6c8 100644
--- a/dlls/user32/input.c
+++ b/dlls/user32/input.c
@@ -180,7 +180,7 @@ static void update_mouse_coords( INPUT *input )
 UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
 {
     UINT i;
-    NTSTATUS status;
+    NTSTATUS status = STATUS_SUCCESS;
 
     if (size != sizeof(INPUT))
     {
@@ -202,14 +202,20 @@ UINT WINAPI SendInput( UINT count, LPINPUT inputs, int size )
 
     for (i = 0; i < count; i++)
     {
-        if (inputs[i].type == INPUT_MOUSE)
+        INPUT input = inputs[i];
+        switch (input.type)
         {
+        case INPUT_MOUSE:
             /* we need to update the coordinates to what the server expects */
-            INPUT input = inputs[i];
             update_mouse_coords( &input );
+            /* fallthrough */
+        case INPUT_KEYBOARD:
             status = send_hardware_message( 0, &input, SEND_HWMSG_INJECTED );
+            break;
+        case INPUT_HARDWARE:
+            SetLastError( ERROR_CALL_NOT_IMPLEMENTED );
+            return 0;
         }
-        else status = send_hardware_message( 0, &inputs[i], SEND_HWMSG_INJECTED );
 
         if (status)
         {
diff --git a/dlls/user32/tests/input.c b/dlls/user32/tests/input.c
index 0bbd03c615e..2397b4104e4 100644
--- a/dlls/user32/tests/input.c
+++ b/dlls/user32/tests/input.c
@@ -4285,12 +4285,11 @@ static void test_SendInput(void)
     input[1].hi.wParamH = 'A' | 0xc000;
     SetLastError( 0xdeadbeef );
     res = SendInput( 16, input, sizeof(*input) );
-    todo_wine
     ok( (res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) ||
         broken(res == 16 && GetLastError() == 0xdeadbeef) /* 32bit */,
         "SendInput returned %u, error %#x\n", res, GetLastError() );
     while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
-    todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+    ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
     empty_message_queue();
 
     memset( input, 0, sizeof(input) );
@@ -4303,21 +4302,20 @@ static void test_SendInput(void)
     input[2].ki.dwFlags = KEYEVENTF_KEYUP;
     SetLastError( 0xdeadbeef );
     res = SendInput( 16, input, sizeof(*input) );
-    todo_wine
     ok( (res == 0 && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) ||
         broken(res == 16 && GetLastError() == 0xdeadbeef),
         "SendInput returned %u, error %#x\n", res, GetLastError() );
     while ((res = wait_for_message(&msg)) && (msg.message == WM_TIMER || broken(msg.message == WM_KEYDOWN || msg.message == WM_KEYUP)))
         DispatchMessageA(&msg);
-    todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+    ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
     empty_message_queue();
 
     for (i = 0; i < ARRAY_SIZE(input); ++i) input[i].type = INPUT_HARDWARE + 1;
     SetLastError( 0xdeadbeef );
     res = SendInput( 16, input, sizeof(*input) );
-    todo_wine ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
+    ok( res == 16 && GetLastError() == 0xdeadbeef, "SendInput returned %u, error %#x\n", res, GetLastError() );
     while ((res = wait_for_message(&msg)) && msg.message == WM_TIMER) DispatchMessageA(&msg);
-    todo_wine ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
+    ok( !res, "SendInput triggered unexpected message %#x\n", msg.message );
     empty_message_queue();
 
     trace( "done\n" );




More information about the wine-cvs mailing list