From: Fabian Maurer Subject: [PATCH] user32: Also remove WM_CHAR from queue when a menu gets VK_ESCAPE and add tests Message-Id: <20170118214002.18578-1-dark.shadow4@web.de> Date: Wed, 18 Jan 2017 22:40:02 +0100 Fixes https://bugs.winehq.org/show_bug.cgi?id=41489 Signed-off-by: Fabian Maurer --- dlls/user32/menu.c | 6 +++++- dlls/user32/tests/menu.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c index 59fcd9c488..d8b36a5460 100644 --- a/dlls/user32/menu.c +++ b/dlls/user32/menu.c @@ -3186,8 +3186,12 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y, break; case VK_ESCAPE: + { + MSG msg_dummy; fEndMenu = MENU_KeyEscape(&mt, wFlags); - break; + PeekMessageW(&msg_dummy, 0, WM_CHAR, WM_CHAR, PM_REMOVE); + break; + } case VK_F1: { diff --git a/dlls/user32/tests/menu.c b/dlls/user32/tests/menu.c index a42bc1c639..71f8620773 100644 --- a/dlls/user32/tests/menu.c +++ b/dlls/user32/tests/menu.c @@ -3322,6 +3322,53 @@ static void test_menu_setmenuinfo(void) return; } +/* Test handling of VK_ESCAPE to close the menu */ +static LRESULT WINAPI esc_test_wnd_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + if(msg == WM_SHOWWINDOW) + { + PostMessageW(hwnd, WM_KEYDOWN, VK_ESCAPE, 0); + HMENU hPopupMenu = CreatePopupMenu(); + InsertMenuA(hPopupMenu, 0, MF_STRING, 10, "test"); + TrackPopupMenu(hPopupMenu, 0, 0, 0, 0, hwnd, NULL); + PostQuitMessage(0); + } + + if(msg == WM_CHAR || msg == WM_KEYDOWN) + ok(0, "Wrong VK_ESCAPE press detected.\n"); + + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void test_menu_close(void) +{ + MSG msg; + WNDCLASSA wclass = {0}; + HINSTANCE hInstance = GetModuleHandleA( NULL ); + HANDLE hWnd; + ATOM aclass; + BOOL ret; + + wclass.lpszClassName = "MenuTestCloseClass"; + wclass.lpfnWndProc = esc_test_wnd_proc; + wclass.hInstance = hInstance; + + aclass = RegisterClassA( &wclass ); + ok (aclass, "MenuTest class not created\n"); + if (!aclass) return; + hWnd = CreateWindowA(wclass.lpszClassName, "MenuTest", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, + 400, 200, NULL, NULL, hInstance, NULL); + ok (hWnd != NULL, "MenuTest window not created\n"); + + ShowWindow(hWnd, SW_SHOW); + + while( (ret = GetMessageW( &msg, NULL, 0, 0 )) != 0) + { + TranslateMessage(&msg); + DispatchMessageW(&msg); + } +} + /* little func to easy switch either TrackPopupMenu() or TrackPopupMenuEx() */ static DWORD MyTrackPopupMenu( int ex, HMENU hmenu, UINT flags, INT x, INT y, HWND hwnd, LPTPMPARAMS ptpm) { @@ -4326,6 +4373,7 @@ START_TEST(menu) test_menu_flags(); test_menu_hilitemenuitem(); + test_menu_close(); test_menu_trackpopupmenu(); test_menu_trackagain(); test_menu_cancelmode(); -- 2.11.0