diff --git a/dlls/user32/dialog.c b/dlls/user32/dialog.c index c5c646e0b12..c47bd571ae3 100644 --- a/dlls/user32/dialog.c +++ b/dlls/user32/dialog.c @@ -1237,8 +1237,16 @@ BOOL WINAPI IsDialogMessageW( HWND hwndDlg, LPMSG msg ) if (!(dlgCode & DLGC_WANTARROWS)) { BOOL fPrevious = (msg->wParam == VK_LEFT || msg->wParam == VK_UP); - HWND hwndNext = GetNextDlgGroupItem (hwndDlg, GetFocus(), fPrevious ); - SendMessageW( hwndDlg, WM_NEXTDLGCTL, (WPARAM)hwndNext, 1 ); + HWND hwndNext = GetNextDlgGroupItem( hwndDlg, msg->hwnd, fPrevious ); + if (hwndNext && SendMessageW( hwndNext, WM_GETDLGCODE, msg->wParam, (LPARAM)msg ) == (DLGC_BUTTON | DLGC_RADIOBUTTON)) + { + SetFocus( hwndNext ); + if ((GetWindowLongW( hwndNext, GWL_STYLE ) & BS_TYPEMASK) == BS_AUTORADIOBUTTON && + SendMessageW( hwndNext, BM_GETCHECK, 0, 0 ) != BST_CHECKED) + SendMessageW( hwndNext, BM_CLICK, 1, 0 ); + } + else + SendMessageW( hwndDlg, WM_NEXTDLGCTL, (WPARAM)hwndNext, 1 ); return TRUE; } break; diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c index 6e62873023b..f78858f4d49 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c @@ -7057,11 +7057,9 @@ if (0) /* actual message sequence is different on every run in some Windows setu while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); ok_sequence(auto_radio_button_VK_DOWN_dialog, "IsDialogMessage(VK_DOWN)", TRUE); -todo_wine test_radio(radio1, 1, radio2, 0, radio3, 0); hwnd = GetFocus(); -todo_wine ok(hwnd == radio1, "focus should be on radio1, not on %p\n", hwnd); GetWindowRect(radio1, &rc); @@ -7076,11 +7074,9 @@ todo_wine while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); ok_sequence(auto_radio_button_VK_DOWN_radio3, "down to radio3", TRUE); -todo_wine test_radio(radio1, 1, radio2, 0, radio3, 0); hwnd = GetFocus(); -todo_wine ok(hwnd == radio1, "focus should be on radio1, not on %p\n", hwnd); flush_events(); @@ -7097,11 +7093,9 @@ todo_wine while (PeekMessageA(&msg, 0, 0, 0, PM_REMOVE)) DispatchMessageA(&msg); ok_sequence(auto_radio_button_VK_UP_radio1, "up to radio1", TRUE); -todo_wine test_radio(radio1, 1, radio2, 0, radio3, 0); hwnd = GetFocus(); -todo_wine ok(hwnd == radio1, "focus should be on radio1, not on %p\n", hwnd); flush_events(); @@ -7119,7 +7113,6 @@ todo_wine if (0) /* actual message sequence is different on every run in some Windows setups */ ok_sequence(auto_radio_button_VK_UP_dialog, "IsDialogMessage(VK_UP) #3", FALSE); /* what really matters is that nothing has changed */ -todo_wine test_radio(radio1, 1, radio2, 0, radio3, 0); log_all_parent_messages--;