From: Zhiyi Zhang zzhang@codeweavers.com
This is an undocumented behavior needed by React Native apps, based on Nikolay's findings. --- dlls/user32/message.c | 7 +++++++ dlls/user32/tests/msg.c | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dlls/user32/message.c b/dlls/user32/message.c index 205d3e01c02..3b541959faf 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -640,6 +640,9 @@ BOOL WINAPI SendMessageCallbackA( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa { struct send_message_callback_params params = { .callback = callback, .data = data };
+ if (!callback && data == 1) + return PostMessageA( hwnd, msg, wparam, lparam ); + if (!WIN_IsCurrentThread( hwnd ) && !map_wparam_AtoW( msg, &wparam, WMCHAR_MAP_SENDMESSAGE )) return FALSE;
@@ -654,6 +657,10 @@ BOOL WINAPI SendMessageCallbackW( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lpa SENDASYNCPROC callback, ULONG_PTR data ) { struct send_message_callback_params params = { .callback = callback, .data = data }; + + if (!callback && data == 1) + return PostMessageW( hwnd, msg, wparam, lparam ); + return NtUserMessageCall( hwnd, msg, wparam, lparam, ¶ms, NtUserSendMessageCallback, FALSE ); }
diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 1c2d61c7781..9089e96aa84 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -16525,16 +16525,16 @@ static void test_nullCallback(void) /* NULL callback and data being 1. The result suggests that the message is posted to the window */ flush_sequence(); SendMessageCallbackA(hwnd, WM_USER, 0, 0, NULL, 1); - ok_sequence(WmEmptySeq, "WM_USER with NULL callback", TRUE); + ok_sequence(WmEmptySeq, "WM_USER with NULL callback", FALSE); flush_events(); - ok_sequence(WmUserSeq, "WM_USER with NULL callback after flushing events", TRUE); + ok_sequence(WmUserSeq, "WM_USER with NULL callback after flushing events", FALSE);
/* NULL callback and data being 1. The result suggests that the message is posted to the window */ flush_sequence(); SendMessageCallbackW(hwnd, WM_USER, 0, 0, NULL, 1); - ok_sequence(WmEmptySeq, "WM_USER with NULL callback", TRUE); + ok_sequence(WmEmptySeq, "WM_USER with NULL callback", FALSE); flush_events(); - ok_sequence(WmUserSeq, "WM_USER with NULL callback after flushing events", TRUE); + ok_sequence(WmUserSeq, "WM_USER with NULL callback after flushing events", FALSE);
/* NULL callback and data being 2 */ flush_sequence();