[Bug 26560] Amazon MP3 Downloader: left mouse click on menus doesn't work (WM_MENUSELECT message not seen by app hook during popup menu tracking)
wine-bugs at winehq.org
wine-bugs at winehq.org
Tue Jan 21 16:45:21 CST 2014
https://bugs.winehq.org/show_bug.cgi?id=26560
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
CC| |focht at gmx.net
Component|-unknown |user32
Summary|Amazon MP3 Downloader: |Amazon MP3 Downloader: left
|Menus don't work. |mouse click on menus
| |doesn't work (WM_MENUSELECT
| |message not seen by app
| |hook during popup menu
| |tracking)
Ever confirmed|0 |1
--- Comment #5 from Anastasius Focht <focht at gmx.net> ---
Hello folks,
confirming.
The app installs a WH_MSGFILTER type hook with SetWindowsHookExW() and calls
TrackPopupMenuEx() with flags
(TPM_RIGHTBUTTON|TPM_LEFTALIGN|TPM_TOPALIGN|TPM_VERTICAL|TPM_VERPOSANIMATION),
meaning that both, right and left mouse button click should have the same
effect.
Right mouse click works:
--- snip ---
$ pwd
/home/focht/.wine/drive_c/Program Files/Amazon/MP3 Downloader
$ WINEDEBUG=+tid,+seh,+relay,+msg,+win,+menu wine ./AmazonMP3Downloader.exe
>>log.txt 2>&1
...
0025:Call user32.SetWindowsHookExW(ffffffff,004baa70,00000000,00000025)
ret=004badae
0025:Ret user32.SetWindowsHookExW() retval=000100ec ret=004badae
0025:Call
user32.TrackPopupMenuEx(00010084,00001042,00000153,000000f2,00020076,0032f83c)
ret=004bade1
0025:trace:menu:TrackPopupMenuEx hmenu 0x10084 flags 1042 (339,242) hwnd
0x20076 lpTpm 0x32f83c rect (339,223)-(379,242)
0025:trace:menu:MENU_InitTracking hwnd=0x20076 hmenu=0x10084
0025:Call window proc 0x4cc4db
(hwnd=0x20076,msg=WM_ENTERMENULOOP,wp=00000001,lp=00000000)
0025:Call user32.CallWindowProcW(7159389f,00020076,00000211,00000001,00000000)
ret=004ca5ff
0025:Call window proc 0x7159389f
(hwnd=0x20076,msg=WM_ENTERMENULOOP,wp=00000001,lp=00000000)
...
0025:trace:msg:peek_message got type 7 msg 205 (WM_RBUTTONUP) hwnd 0x100ee wp 0
lp 0
0025:Call hook proc 0x4baa70 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
0025:Call user32.CallNextHookEx(000100ec,00000002,00000000,0032f6c8)
ret=004baab1
0025:Call hook proc 0x4d0438 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
0025:Call user32.GetParent(000100ee) ret=004ce1e4
0025:Ret user32.GetParent() retval=0001007c ret=004ce1e4
0025:Call user32.GetParent(000100ee) ret=004cc671
0025:Ret user32.GetParent() retval=0001007c ret=004cc671
0025:Call user32.GetParent(0001007c) ret=004ce1e4
0025:Ret user32.GetParent() retval=00000000 ret=004ce1e4
0025:Call user32.GetParent(0001007c) ret=004cc671
0025:Ret user32.GetParent() retval=00000000 ret=004cc671
0025:Ret hook proc 0x4d0438 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
retval=00000000
0025:Ret user32.CallNextHookEx() retval=00000000 ret=004baab1
0025:Ret hook proc 0x4baa70 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
retval=00000000
0025:trace:menu:MENU_ButtonUp 0x32f6b0 hmenu=0x10084
0025:trace:win:GetWindowRect hwnd 0x100ee (339,242)-(501,334)
0025:trace:menu:do_debug_print_menuitem FocusedItem: { ID=0xe140, State=hi,
Text=L"&About..." }
0025:trace:menu:MENU_ExecFocusedItem 0x32f6b0 hmenu=0x10084
0025:trace:menu:MENU_ExecFocusedItem hMenu 0x10084 wID 0000e140 hSubMenu (nil)
fType 0000
0025:trace:msg:PostMessageW hwnd 0x20076 msg 111 (WM_COMMAND) wp e140 lp 0
0025:trace:menu:MENU_TrackMenu executedMenuId 57664
...
0025:trace:menu:MENU_ExitTracking hwnd=0x20076
0025:Call window proc 0x4cc4db
(hwnd=0x20076,msg=WM_EXITMENULOOP,wp=00000001,lp=00000000)
0025:Call user32.CallWindowProcW(7159389f,00020076,00000212,00000001,00000000)
ret=004ca5ff
0025:Call window proc 0x7159389f
(hwnd=0x20076,msg=WM_EXITMENULOOP,wp=00000001,lp=00000000)
0025:Call user32.GetWindowLongA(00020076,00000000) ret=715938b4
0025:Ret user32.GetWindowLongA() retval=00148440 ret=715938b4
0025:Call user32.DefWindowProcW(00020076,00000212,00000001,00000000)
ret=71593c5b
0025:Ret user32.DefWindowProcW() retval=00000000 ret=71593c5b
0025:Ret window proc 0x7159389f
(hwnd=0x20076,msg=WM_EXITMENULOOP,wp=00000001,lp=00000000) retval=00000000
0025:Ret user32.CallWindowProcW() retval=00000000 ret=004ca5ff
0025:Ret window proc 0x4cc4db
(hwnd=0x20076,msg=WM_EXITMENULOOP,wp=00000001,lp=00000000) retval=00000000
0025:Ret user32.TrackPopupMenuEx() retval=00000001 ret=004bade1
0025:Call user32.UnhookWindowsHookEx(000100ec) ret=004baded
0025:Ret user32.UnhookWindowsHookEx() retval=00000001 ret=004baded
...
--- snip ---
Left mouse click (doesn't work):
--- snip ---
0025:trace:msg:peek_message got type 7 msg 202 (WM_LBUTTONUP) hwnd 0x100ee wp 0
lp 0
0025:Call hook proc 0x4baa70 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
0025:Ret hook proc 0x4baa70 (id=WH_MSGFILTER,code=2,wp=00000000,lp=0032f6c8)
retval=00000001
0025:trace:msg:peek_message got type 7 msg 202 (WM_LBUTTONUP) hwnd 0x100ee wp 0
lp 0
0025:Call
winex11.drv.MsgWaitForMultipleObjectsEx(00000000,00000000,00000000,000004ff,00000000)
ret=7ec19c4b
0025:Ret winex11.drv.MsgWaitForMultipleObjectsEx() retval=00000102
ret=7ec19c4b
0025:Call
winex11.drv.MsgWaitForMultipleObjectsEx(00000001,0032f450,ffffffff,000004ff,00000000)
ret=7ec19c4b
0025:Ret winex11.drv.MsgWaitForMultipleObjectsEx() retval=00000000
ret=7ec19c4b
--- snip ---
The hook eats WM_LBUTTONUP messages during tracking (retval 0x1).
Looking at the app's hook code it seems that WM_MENUSELECT message needs to be
seen by the hook (= stores menu item id) before WM_LBUTTONUP is properly
processed.
--- snip ---
004BA120 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
004BA124 83EC 08 SUB ESP,8
004BA127 53 PUSH EBX
004BA128 55 PUSH EBP
004BA129 56 PUSH ESI
004BA12A 8BF1 MOV ESI,ECX
004BA12C 8B48 04 MOV ECX,DWORD PTR DS:[EAX+4] ; msg.message
004BA12F 81F9 00020000 CMP ECX,200 ; WM_MOUSEFIRST
004BA135 57 PUSH EDI
004BA136 0F87 42020000 JA 004BA37E
004BA13C 0F84 7E010000 JE 004BA2C0 ; WM_MOUSEMOVE
004BA142 81E9 00010000 SUB ECX,100 ; WM_KEYFIRST
004BA148 74 68 JZ SHORT 004BA1B2
004BA14A 83E9 1F SUB ECX,1F ; WM_MENUSELECT
004BA14D 0F85 06030000 JNZ 004BA459
004BA153 8B48 0C MOV ECX,DWORD PTR DS:[EAX+0C] ; msg.lParam
004BA156 898E 8C000000 MOV DWORD PTR DS:[ESI+8C],ECX
004BA15C 0FB750 08 MOVZX EDX,WORD PTR DS:[EAX+8] ; msg.wParam (id)
004BA160 33C9 XOR ECX,ECX
004BA162 8A48 0A MOV CL,BYTE PTR DS:[EAX+0A]
004BA165 BB 01000000 MOV EBX,1
004BA16A 8915 D0805300 MOV DWORD PTR DS:[5380D0],EDX ; (id)
...
004BA37E 81E9 01020000 SUB ECX,201 ; WM_LBUTTONDOWN
004BA384 74 6E JZ SHORT 004BA3F4
004BA386 49 DEC ECX ; WM_LBUTTONUP
004BA387 0F85 CC000000 JNZ 004BA459
004BA38D A1 D0805300 MOV EAX,DWORD PTR DS:[5380D0] ; msg.wParam (id)
004BA392 85C0 TEST EAX,EAX
004BA394 8BF8 MOV EDI,EAX
004BA396 74 4D JZ SHORT 004BA3E5
004BA398 6A 00 PUSH 0
004BA39A 50 PUSH EAX
004BA39B A1 C8805300 MOV EAX,DWORD PTR DS:[5380C8]
004BA3A0 8B88 8C000000 MOV ECX,DWORD PTR DS:[EAX+8C]
004BA3A6 51 PUSH ECX
004BA3A7 FF15 2C854E00 CALL DWORD PTR DS:[<&USER32.GetMenuState>]
...
004BA3E5 5F POP EDI
004BA3E6 5E POP ESI
004BA3E7 5D POP EBP
004BA3E8 B8 01000000 MOV EAX,1
004BA3ED 5B POP EBX
004BA3EE 83C4 08 ADD ESP,8
004BA3F1 C2 0400 RETN 4
...
--- snip ---
Source:
http://source.winehq.org/git/wine.git/blob/77ee42fd330130c55b6b74ab8662a23774551ea4:/dlls/user32/menu.c#l2978
--- snip ---
2978 static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
2979 HWND hwnd, const RECT *lprect )
2980 {
...
3020 __TRY while (!fEndMenu)
3021 {
3022 menu = MENU_GetMenu( mt.hCurrentMenu );
3023 if (!menu) /* sometimes happens if I do a window manager close */
3024 break;
3025
3026 /* we have to keep the message in the queue until it's
3027 * clear that menu loop is not over yet. */
3028
3029 for (;;)
3030 {
3031 if (PeekMessageW( &msg, 0, 0, 0, PM_NOREMOVE ))
3032 {
3033 if (!CallMsgFilterW( &msg, MSGF_MENU )) break;
3034 /* remove the message from the queue */
3035 PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
3036 }
3037 else
3038 {
3039 if (!enterIdleSent)
3040 {
3041 HWND win = menu->wFlags & MF_POPUP ? menu->hWnd : 0;
3042 enterIdleSent = TRUE;
3043 SendMessageW( mt.hOwnerWnd, WM_ENTERIDLE, MSGF_MENU,
(LPARAM)win );
3044 }
3045 WaitMessage();
3046 }
3047 }
...
3068 fRemove = FALSE;
3069 if ((msg.message >= WM_MOUSEFIRST) && (msg.message <= WM_MOUSELAST))
3070 {
...
3082 switch(msg.message)
3083 {
...
3120 case WM_MOUSEMOVE:
3121 /* the selected menu item must be changed every time */
3122 /* the mouse moves. */
3123
3124 if (hmenu)
3125 fEndMenu |= !MENU_MouseMove( &mt, hmenu, wFlags );
3126
3127 } /* switch(msg.message) - mouse */
3128 }
...
--- snip ---
$ sha1sum AmazonMP3Installer.exe
011887aaffdfe0773b8d9ca9ba0317b3ba883a6e AmazonMP3Installer.exe
$ du -sh AmazonMP3Installer.exe
592K AmazonMP3Installer.exe
$ wine --version
wine-1.7.11-159-gee33839
Regards
--
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.
More information about the wine-bugs
mailing list