Question about ToolbarWindowProc

Jeremy Shaw jeremy at
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!
Jeremy Shaw.

More information about the wine-devel mailing list