Question about ToolbarWindowProc
jeremy at lindows.com
Wed Feb 27 18:30:25 CST 2002
Let me ask a different question on the same subject. I am going to start with a bit of background first.
Under internet explorer, the favorites menu is not really a 'menu' but a toolbar that is laid out top to bottom instead of left to right. (that is somewhat of a simplification, there are actually two toolbar windows, a SysPager window, and a few others involved). Under wine, when the Favorites menu is displayed it has the correct width but is only 8 pixels tall. If I use the native comctl32.dll from Windows ME, the menu works correctly.
Now, If I use the WindomsME comctl32.dll BUT modify SendMessageA to block the Favorites menu from receiving message 0x463, then the Favorites menu reverts to only being 8 pixel tall.
Here are some brief traces using the wine builtin and WinME comctl32.dll (this is WITHOUT the patch to block msg 0x463)
** Builtin **
0806b4a8:CALL SHLWAPI.136: @(00010040,00000463,00000001,405c2fb4) ret=7102dc2e
0806b4a8:Call user32.SendMessageA(00010040,00000463,00000001,405c2fb4) ret=70bd2540
0806b4a8:Call window proc 0x40fe2d74 (hwnd=00010040,msg=WM_USER+0063,wp=00000001,lp=405c2fb4)
0806b4a8:Call user32.GetWindowLongA(00010040,00000000) ret=40fe2dcb
0806b4a8:Ret user32.GetWindowLongA() retval=428c2544 ret=40fe2dcb
err:toolbar:ToolbarWindowProc unknown msg 0463 wp=00000001 lp=405c2fb4
0806b4a8:Call user32.DefWindowProcA(00010040,00000463,00000001,405c2fb4) ret=40fe3c81
0806b4a8:Ret user32.DefWindowProcA() retval=00000000 ret=40fe3c81
0806b4a8:Ret window proc 0x40fe2d74 (hwnd=00010040,msg=WM_USER+0063,wp=00000001,lp=405c2fb4) retval=00000000
0806b4a8:Ret user32.SendMessageA() retval=00000000 ret=70bd2540
0806b4a8:RET SHLWAPI.136: @() retval = 00000000 ret=7102dc2e
** Native (comctl32.dll from WinMe) **
0806b4d8:CALL SHLWAPI.136: @(0001003d,00000463,00000001,405c29e0) ret=7102dc2e
0806b4d8:Call user32.SendMessageA(0001003d,00000463,00000001,405c29e0) ret=70bd2540
0806b4d8:Call window proc 0x77b562ef (hwnd=0001003d,msg=WM_USER+0063,wp=00000001,lp=405c29e0)
0806b4d8:Call user32.GetPropW(0001003d,0000c050) ret=77b56337
0806b4d8:Ret user32.GetPropW() retval=4044e410 ret=77b56337
0806b4d8:CALL COMCTL32.413: @(0001003d,00000463,00000001,405c29e0) ret=7103f54b
0806b4d8:Call user32.IsWindow(0001003d) ret=77b564ca
0806b4d8:Ret user32.IsWindow() retval=00000001 ret=77b564ca
0806b4d8:Call user32.GetPropW(0001003d,0000c050) ret=77b564eb
0806b4d8:Ret user32.GetPropW() retval=4044e410 ret=77b564eb
0806b4d8:Call kernel32.GetCurrentThreadId() ret=77b564f7
0806b4d8:Ret kernel32.GetCurrentThreadId() retval=0806b4d8 ret=77b564f7
0806b4d8:Call user32.CallWindowProcW(77b5655c,0001003d,00000463,00000001,405c29e0) ret=77b56535
0806b4d8:Call window proc 0x77b5655c (hwnd=0001003d,msg=WM_USER+0063,wp=00000001,lp=405c29e0)
0806b4d8:Call user32.GetWindowLongA(0001003d,00000000) ret=77b56571
0806b4d8:Ret user32.GetWindowLongA() retval=4044e688 ret=77b56571
0806b4d8:Ret window proc 0x77b5655c (hwnd=0001003d,msg=WM_USER+0063,wp=00000001,lp=405c29e0) retval=00000001
0806b4d8:Ret user32.CallWindowProcW() retval=00000001 ret=77b56535
0806b4d8:RET COMCTL32.413: @() retval = 00000001 ret=7103f54b
0806b4d8:Call user32.IsWindow(0001003d) ret=77b56396
0806b4d8:Ret user32.IsWindow() retval=00000001 ret=77b56396
0806b4d8:Ret window proc 0x77b562ef (hwnd=0001003d,msg=WM_USER+0063,wp=00000001,lp=405c29e0) retval=00000001
0806b4d8:Ret user32.SendMessageA() retval=00000001 ret=70bd2540
0806b4d8:RET SHLWAPI.136: @() retval = 00000001 ret=7102dc2e
As mentioned later in this thread, it appears that there is some sort of subclassing going on here.
Currently I have only been working on trying to figure out what happens when you call window proc 0x77b5655c and pass it msg WM_USER + 0063. Obviously, its not doing a whole lot since the only function it calls is "GetWindowLongA". GetWindowLongA is presumably returning a pointer to a structure similar to TOOLBAR_INFO. My best guess is that the function is calcaluting the height of the favorites menu (by adding together the heights of all the buttons in the toolbar) and copying the height to another field in the TOOLBAR_INFO-like structure.
So, my question is, where do I go from here? Since message 0x463 is undocumented, I do not know how to proceed except by disassembling the windows version of comctl32.dll. And, as part of that, it would be very beneficial to know what the structure returned by GetWindowLongA looks like.
Thanks for your help!
More information about the wine-devel