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