user32/tests: Fix some combo box tests for different font sizes.
[wine] / dlls / user32 / spy.c
1 /*
2  * Message spying routines
3  *
4  * Copyright 1994, Bob Amstadt
5  *           1995, Alex Korobka
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20  */
21
22 #include <stdlib.h>
23 #include <string.h>
24 #include <stdarg.h>
25 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winreg.h"
30 #include "wine/unicode.h"
31 #include "win.h"
32 #include "user_private.h"
33 #include "wine/debug.h"
34 #include "commctrl.h"
35 #include "commdlg.h"
36 #include "richedit.h"
37
38 WINE_DEFAULT_DEBUG_CHANNEL(message);
39
40 #define SPY_MAX_MSGNUM   WM_USER
41 #define SPY_INDENT_UNIT  4  /* 4 spaces */
42
43 #define DEBUG_SPY 0
44
45 static const char * const ClassLongOffsetNames[] =
46 {
47     "GCLP_MENUNAME",      /*  -8 */
48     "GCLP_HBRBACKGROUND", /* -10 */
49     "GCLP_HCURSOR",       /* -12 */
50     "GCLP_HICON",         /* -14 */
51     "GCLP_HMODULE",       /* -16 */
52     "GCL_CBWNDEXTRA",     /* -18 */
53     "GCL_CBCLSEXTRA",     /* -20 */
54     "?",
55     "GCLP_WNDPROC",       /* -24 */
56     "GCL_STYLE",          /* -26 */
57     "?",
58     "?",
59     "GCW_ATOM",           /* -32 */
60     "GCLP_HICONSM",       /* -34 */
61 };
62
63 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
64 {
65     "WM_NULL",                  /* 0x00 */
66     "WM_CREATE",
67     "WM_DESTROY",
68     "WM_MOVE",
69     "wm_sizewait",
70     "WM_SIZE",
71     "WM_ACTIVATE",
72     "WM_SETFOCUS",
73     "WM_KILLFOCUS",
74     "WM_SETVISIBLE",
75     "WM_ENABLE",
76     "WM_SETREDRAW",
77     "WM_SETTEXT",
78     "WM_GETTEXT",
79     "WM_GETTEXTLENGTH",
80     "WM_PAINT",
81     "WM_CLOSE",                 /* 0x10 */
82     "WM_QUERYENDSESSION",
83     "WM_QUIT",
84     "WM_QUERYOPEN",
85     "WM_ERASEBKGND",
86     "WM_SYSCOLORCHANGE",
87     "WM_ENDSESSION",
88     "wm_systemerror",
89     "WM_SHOWWINDOW",
90     "WM_CTLCOLOR",
91     "WM_WININICHANGE",
92     "WM_DEVMODECHANGE",
93     "WM_ACTIVATEAPP",
94     "WM_FONTCHANGE",
95     "WM_TIMECHANGE",
96     "WM_CANCELMODE",
97     "WM_SETCURSOR",             /* 0x20 */
98     "WM_MOUSEACTIVATE",
99     "WM_CHILDACTIVATE",
100     "WM_QUEUESYNC",
101     "WM_GETMINMAXINFO",
102     "wm_unused3",
103     "wm_painticon",
104     "WM_ICONERASEBKGND",
105     "WM_NEXTDLGCTL",
106     "wm_alttabactive",
107     "WM_SPOOLERSTATUS",
108     "WM_DRAWITEM",
109     "WM_MEASUREITEM",
110     "WM_DELETEITEM",
111     "WM_VKEYTOITEM",
112     "WM_CHARTOITEM",
113     "WM_SETFONT",               /* 0x30 */
114     "WM_GETFONT",
115     "WM_SETHOTKEY",
116     "WM_GETHOTKEY",
117     "wm_filesyschange",
118     "wm_isactiveicon",
119     "wm_queryparkicon",
120     "WM_QUERYDRAGICON",
121     "wm_querysavestate",
122     "WM_COMPAREITEM",
123     "wm_testing",
124     NULL,
125     NULL,
126     "WM_GETOBJECT",             /* 0x3d */
127     "wm_activateshellwindow",
128     NULL,
129
130     NULL,                       /* 0x40 */
131     "wm_compacting", NULL, NULL,
132     "WM_COMMNOTIFY", NULL,
133     "WM_WINDOWPOSCHANGING",     /* 0x0046 */
134     "WM_WINDOWPOSCHANGED",      /* 0x0047 */
135     "WM_POWER", NULL,
136     "WM_COPYDATA",
137     "WM_CANCELJOURNAL", NULL, NULL,
138     "WM_NOTIFY", NULL,
139
140     /* 0x0050 */
141     "WM_INPUTLANGCHANGEREQUEST",
142     "WM_INPUTLANGCHANGE",
143     "WM_TCARD",
144     "WM_HELP",
145     "WM_USERCHANGED",
146     "WM_NOTIFYFORMAT", NULL, NULL,
147     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
148
149     /* 0x0060 */
150     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
151     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
152
153     /* 0x0070 */
154     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
155     NULL, NULL, NULL,
156     "WM_CONTEXTMENU",
157     "WM_STYLECHANGING",
158     "WM_STYLECHANGED",
159     "WM_DISPLAYCHANGE",
160     "WM_GETICON",
161
162     "WM_SETICON",               /* 0x0080 */
163     "WM_NCCREATE",              /* 0x0081 */
164     "WM_NCDESTROY",             /* 0x0082 */
165     "WM_NCCALCSIZE",            /* 0x0083 */
166     "WM_NCHITTEST",             /* 0x0084 */
167     "WM_NCPAINT",               /* 0x0085 */
168     "WM_NCACTIVATE",            /* 0x0086 */
169     "WM_GETDLGCODE",            /* 0x0087 */
170     "WM_SYNCPAINT",
171     "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
172
173     /* 0x0090 */
174     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
175     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
176
177     /* 0x00A0 */
178     "WM_NCMOUSEMOVE",           /* 0x00a0 */
179     "WM_NCLBUTTONDOWN",         /* 0x00a1 */
180     "WM_NCLBUTTONUP",           /* 0x00a2 */
181     "WM_NCLBUTTONDBLCLK",       /* 0x00a3 */
182     "WM_NCRBUTTONDOWN",         /* 0x00a4 */
183     "WM_NCRBUTTONUP",           /* 0x00a5 */
184     "WM_NCRBUTTONDBLCLK",       /* 0x00a6 */
185     "WM_NCMBUTTONDOWN",         /* 0x00a7 */
186     "WM_NCMBUTTONUP",           /* 0x00a8 */
187     "WM_NCMBUTTONDBLCLK",       /* 0x00a9 */
188     NULL,                       /* 0x00aa */
189     "WM_NCXBUTTONDOWN",         /* 0x00ab */
190     "WM_NCXBUTTONUP",           /* 0x00ac */
191     "WM_NCXBUTTONDBLCLK",       /* 0x00ad */
192     NULL,                       /* 0x00ae */
193     NULL,                       /* 0x00af */
194
195     /* 0x00B0 - Win32 Edit controls */
196     "EM_GETSEL",                /* 0x00b0 */
197     "EM_SETSEL",                /* 0x00b1 */
198     "EM_GETRECT",               /* 0x00b2 */
199     "EM_SETRECT",               /* 0x00b3 */
200     "EM_SETRECTNP",             /* 0x00b4 */
201     "EM_SCROLL",                /* 0x00b5 */
202     "EM_LINESCROLL",            /* 0x00b6 */
203     "EM_SCROLLCARET",           /* 0x00b7 */
204     "EM_GETMODIFY",             /* 0x00b8 */
205     "EM_SETMODIFY",             /* 0x00b9 */
206     "EM_GETLINECOUNT",          /* 0x00ba */
207     "EM_LINEINDEX",             /* 0x00bb */
208     "EM_SETHANDLE",             /* 0x00bc */
209     "EM_GETHANDLE",             /* 0x00bd */
210     "EM_GETTHUMB",              /* 0x00be */
211     NULL,                       /* 0x00bf */
212
213     NULL,                       /* 0x00c0 */
214     "EM_LINELENGTH",            /* 0x00c1 */
215     "EM_REPLACESEL",            /* 0x00c2 */
216     NULL,                       /* 0x00c3 */
217     "EM_GETLINE",               /* 0x00c4 */
218     "EM_LIMITTEXT",             /* 0x00c5 */
219     "EM_CANUNDO",               /* 0x00c6 */
220     "EM_UNDO",                  /* 0x00c7 */
221     "EM_FMTLINES",              /* 0x00c8 */
222     "EM_LINEFROMCHAR",          /* 0x00c9 */
223     NULL,                       /* 0x00ca */
224     "EM_SETTABSTOPS",           /* 0x00cb */
225     "EM_SETPASSWORDCHAR",       /* 0x00cc */
226     "EM_EMPTYUNDOBUFFER",       /* 0x00cd */
227     "EM_GETFIRSTVISIBLELINE",   /* 0x00ce */
228     "EM_SETREADONLY",           /* 0x00cf */
229
230     "EM_SETWORDBREAKPROC",      /* 0x00d0 */
231     "EM_GETWORDBREAKPROC",      /* 0x00d1 */
232     "EM_GETPASSWORDCHAR",       /* 0x00d2 */
233     "EM_SETMARGINS",            /* 0x00d3 */
234     "EM_GETMARGINS",            /* 0x00d4 */
235     "EM_GETLIMITTEXT",          /* 0x00d5 */
236     "EM_POSFROMCHAR",           /* 0x00d6 */
237     "EM_CHARFROMPOS",           /* 0x00d7 */
238     "EM_SETIMESTATUS",          /* 0x00d8 */
239     "EM_GETIMESTATUS",          /* 0x00d9 */
240     NULL, NULL, NULL, NULL, NULL, NULL,
241
242     /* 0x00E0 - Win32 Scrollbars */
243     "SBM_SETPOS",               /* 0x00e0 */
244     "SBM_GETPOS",               /* 0x00e1 */
245     "SBM_SETRANGE",             /* 0x00e2 */
246     "SBM_GETRANGE",             /* 0x00e3 */
247     "SBM_ENABLE_ARROWS",        /* 0x00e4 */
248     NULL,
249     "SBM_SETRANGEREDRAW",       /* 0x00e6 */
250     NULL, NULL,
251     "SBM_SETSCROLLINFO",        /* 0x00e9 */
252     "SBM_GETSCROLLINFO",        /* 0x00ea */
253     NULL, NULL, NULL, NULL, NULL,
254
255     /* 0x00F0 - Win32 Buttons */
256     "BM_GETCHECK",              /* 0x00f0 */
257     "BM_SETCHECK",              /* 0x00f1 */
258     "BM_GETSTATE",              /* 0x00f2 */
259     "BM_SETSTATE",              /* 0x00f3 */
260     "BM_SETSTYLE",              /* 0x00f4 */
261     "BM_CLICK",                 /* 0x00f5 */
262     "BM_GETIMAGE",              /* 0x00f6 */
263     "BM_SETIMAGE",              /* 0x00f7 */
264     NULL, NULL, NULL, NULL, NULL, NULL,
265     "WM_INPUT_DEVICE_CHANGE",   /* 0x00fe */
266     "WM_INPUT",                 /* 0x00ff */
267
268     "WM_KEYDOWN",               /* 0x0100 */
269     "WM_KEYUP",                 /* 0x0101 */
270     "WM_CHAR",                  /* 0x0102 */
271     "WM_DEADCHAR",              /* 0x0103 */
272     "WM_SYSKEYDOWN",            /* 0x0104 */
273     "WM_SYSKEYUP",              /* 0x0105 */
274     "WM_SYSCHAR",               /* 0x0106 */
275     "WM_SYSDEADCHAR",           /* 0x0107 */
276     NULL,
277     "WM_UNICHAR",               /* 0x0109 */
278     "WM_CONVERTREQUEST",        /* 0x010a */
279     "WM_CONVERTRESULT",         /* 0x010b */
280     "WM_INTERIM",               /* 0x010c */
281     "WM_IME_STARTCOMPOSITION",  /* 0x010d */
282     "WM_IME_ENDCOMPOSITION",    /* 0x010e */
283     "WM_IME_COMPOSITION",       /* 0x010f */
284
285     "WM_INITDIALOG",            /* 0x0110 */
286     "WM_COMMAND",               /* 0x0111 */
287     "WM_SYSCOMMAND",            /* 0x0112 */
288     "WM_TIMER",                 /* 0x0113 */
289     "WM_HSCROLL",               /* 0x0114 */
290     "WM_VSCROLL",               /* 0x0115 */
291     "WM_INITMENU",              /* 0x0116 */
292     "WM_INITMENUPOPUP",         /* 0x0117 */
293     "WM_SYSTIMER",              /* 0x0118 */
294     NULL, NULL, NULL, NULL, NULL, NULL,
295     "WM_MENUSELECT",            /* 0x011f */
296
297     "WM_MENUCHAR",              /* 0x0120 */
298     "WM_ENTERIDLE",             /* 0x0121 */
299
300     "WM_MENURBUTTONUP",         /* 0x0122 */
301     "WM_MENUDRAG",              /* 0x0123 */
302     "WM_MENUGETOBJECT",         /* 0x0124 */
303     "WM_UNINITMENUPOPUP",       /* 0x0125 */
304     "WM_MENUCOMMAND",           /* 0x0126 */
305     "WM_CHANGEUISTATE",         /* 0x0127 */
306     "WM_UPDATEUISTATE",         /* 0x0128 */
307     "WM_QUERYUISTATE",          /* 0x0129 */
308
309     NULL, NULL, NULL, NULL, NULL, NULL,
310
311     /* 0x0130 */
312     NULL,
313     "WM_LBTRACKPOINT",          /* 0x0131 */
314     "WM_CTLCOLORMSGBOX",        /* 0x0132 */
315     "WM_CTLCOLOREDIT",          /* 0x0133 */
316     "WM_CTLCOLORLISTBOX",       /* 0x0134 */
317     "WM_CTLCOLORBTN",           /* 0x0135 */
318     "WM_CTLCOLORDLG",           /* 0x0136 */
319     "WM_CTLCOLORSCROLLBAR",     /* 0x0137 */
320     "WM_CTLCOLORSTATIC",        /* 0x0138 */
321     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
322
323     /* 0x0140 - Win32 Comboboxes */
324     "CB_GETEDITSEL",            /* 0x0140 */
325     "CB_LIMITTEXT",             /* 0x0141 */
326     "CB_SETEDITSEL",            /* 0x0142 */
327     "CB_ADDSTRING",             /* 0x0143 */
328     "CB_DELETESTRING",          /* 0x0144 */
329     "CB_DIR",                   /* 0x0145 */
330     "CB_GETCOUNT",              /* 0x0146 */
331     "CB_GETCURSEL",             /* 0x0147 */
332     "CB_GETLBTEXT",             /* 0x0148 */
333     "CB_GETLBTEXTLEN",          /* 0x0149 */
334     "CB_INSERTSTRING",          /* 0x014a */
335     "CB_RESETCONTENT",          /* 0x014b */
336     "CB_FINDSTRING",            /* 0x014c */
337     "CB_SELECTSTRING",          /* 0x014d */
338     "CB_SETCURSEL",             /* 0x014e */
339     "CB_SHOWDROPDOWN",          /* 0x014f */
340
341     "CB_GETITEMDATA",           /* 0x0150 */
342     "CB_SETITEMDATA",           /* 0x0151 */
343     "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */
344     "CB_SETITEMHEIGHT",         /* 0x0153 */
345     "CB_GETITEMHEIGHT",         /* 0x0154 */
346     "CB_SETEXTENDEDUI",         /* 0x0155 */
347     "CB_GETEXTENDEDUI",         /* 0x0156 */
348     "CB_GETDROPPEDSTATE",       /* 0x0157 */
349     "CB_FINDSTRINGEXACT",       /* 0x0158 */
350     "CB_SETLOCALE",             /* 0x0159 */
351     "CB_GETLOCALE",             /* 0x015a */
352     "CB_GETTOPINDEX",           /* 0x015b */
353     "CB_SETTOPINDEX",           /* 0x015c */
354     "CB_GETHORIZONTALEXTENT",   /* 0x015d */
355     "CB_SETHORIZONTALEXTENT",   /* 0x015e */
356     "CB_GETDROPPEDWIDTH",       /* 0x015f */
357
358     "CB_SETDROPPEDWIDTH",       /* 0x0160 */
359     "CB_INITSTORAGE",           /* 0x0161 */
360     NULL, NULL, NULL, NULL, NULL, NULL,
361     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
362
363     /* 0x0170 - Win32 Static controls */
364     "STM_SETICON",              /* 0x0170 */
365     "STM_GETICON",              /* 0x0171 */
366     "STM_SETIMAGE",             /* 0x0172 */
367     "STM_GETIMAGE",             /* 0x0173 */
368     NULL, NULL, NULL, NULL,
369     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
370
371     /* 0x0180 - Win32 Listboxes */
372     "LB_ADDSTRING",             /* 0x0180 */
373     "LB_INSERTSTRING",          /* 0x0181 */
374     "LB_DELETESTRING",          /* 0x0182 */
375     "LB_SELITEMRANGEEX",        /* 0x0183 */
376     "LB_RESETCONTENT",          /* 0x0184 */
377     "LB_SETSEL",                /* 0x0185 */
378     "LB_SETCURSEL",             /* 0x0186 */
379     "LB_GETSEL",                /* 0x0187 */
380     "LB_GETCURSEL",             /* 0x0188 */
381     "LB_GETTEXT",               /* 0x0189 */
382     "LB_GETTEXTLEN",            /* 0x018a */
383     "LB_GETCOUNT",              /* 0x018b */
384     "LB_SELECTSTRING",          /* 0x018c */
385     "LB_DIR",                   /* 0x018d */
386     "LB_GETTOPINDEX",           /* 0x018e */
387     "LB_FINDSTRING",            /* 0x018f */
388
389     "LB_GETSELCOUNT",           /* 0x0190 */
390     "LB_GETSELITEMS",           /* 0x0191 */
391     "LB_SETTABSTOPS",           /* 0x0192 */
392     "LB_GETHORIZONTALEXTENT",   /* 0x0193 */
393     "LB_SETHORIZONTALEXTENT",   /* 0x0194 */
394     "LB_SETCOLUMNWIDTH",        /* 0x0195 */
395     "LB_ADDFILE",               /* 0x0196 */
396     "LB_SETTOPINDEX",           /* 0x0197 */
397     "LB_GETITEMRECT",           /* 0x0198 */
398     "LB_GETITEMDATA",           /* 0x0199 */
399     "LB_SETITEMDATA",           /* 0x019a */
400     "LB_SELITEMRANGE",          /* 0x019b */
401     "LB_SETANCHORINDEX",        /* 0x019c */
402     "LB_GETANCHORINDEX",        /* 0x019d */
403     "LB_SETCARETINDEX",         /* 0x019e */
404     "LB_GETCARETINDEX",         /* 0x019f */
405
406     "LB_SETITEMHEIGHT",         /* 0x01a0 */
407     "LB_GETITEMHEIGHT",         /* 0x01a1 */
408     "LB_FINDSTRINGEXACT",       /* 0x01a2 */
409     "LB_CARETON",               /* 0x01a3 */
410     "LB_CARETOFF",              /* 0x01a4 */
411     "LB_SETLOCALE",             /* 0x01a5 */
412     "LB_GETLOCALE",             /* 0x01a6 */
413     "LB_SETCOUNT",              /* 0x01a7 */
414     "LB_INITSTORAGE",           /* 0x01a8 */
415     "LB_ITEMFROMPOINT",         /* 0x01a9 */
416     NULL, NULL, NULL, NULL, NULL, NULL,
417
418     /* 0x01B0 */
419     NULL, NULL,
420     "LB_GETLISTBOXINFO",         /* 0x01b2 */
421     NULL, NULL, NULL, NULL, NULL,
422     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
423
424     /* 0x01C0 */
425     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
426     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
427
428     /* 0x01D0 */
429     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
430     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
431
432     /* 0x01E0 */
433     NULL,
434     "MN_GETHMENU",              /* 0x01E1 */
435     NULL, NULL, NULL, NULL, NULL, NULL,
436     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
437
438     /* 0x01F0 */
439     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
440     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
441
442     "WM_MOUSEMOVE",             /* 0x0200 */
443     "WM_LBUTTONDOWN",           /* 0x0201 */
444     "WM_LBUTTONUP",             /* 0x0202 */
445     "WM_LBUTTONDBLCLK",         /* 0x0203 */
446     "WM_RBUTTONDOWN",           /* 0x0204 */
447     "WM_RBUTTONUP",             /* 0x0205 */
448     "WM_RBUTTONDBLCLK",         /* 0x0206 */
449     "WM_MBUTTONDOWN",           /* 0x0207 */
450     "WM_MBUTTONUP",             /* 0x0208 */
451     "WM_MBUTTONDBLCLK",         /* 0x0209 */
452     "WM_MOUSEWHEEL",            /* 0x020A */
453     "WM_XBUTTONDOWN",           /* 0x020B */
454     "WM_XBUTTONUP",             /* 0x020C */
455     "WM_XBUTTONDBLCLK",         /* 0x020D */
456     "WM_MOUSEHWHEEL",           /* 0x020E */
457     NULL,
458
459     "WM_PARENTNOTIFY",          /* 0x0210 */
460     "WM_ENTERMENULOOP",         /* 0x0211 */
461     "WM_EXITMENULOOP",          /* 0x0212 */
462     "WM_NEXTMENU",              /* 0x0213 */
463     "WM_SIZING",
464     "WM_CAPTURECHANGED",
465     "WM_MOVING", NULL,
466     "WM_POWERBROADCAST",
467     "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
468
469     "WM_MDICREATE",             /* 0x0220 */
470     "WM_MDIDESTROY",            /* 0x0221 */
471     "WM_MDIACTIVATE",           /* 0x0222 */
472     "WM_MDIRESTORE",            /* 0x0223 */
473     "WM_MDINEXT",               /* 0x0224 */
474     "WM_MDIMAXIMIZE",           /* 0x0225 */
475     "WM_MDITILE",               /* 0x0226 */
476     "WM_MDICASCADE",            /* 0x0227 */
477     "WM_MDIICONARRANGE",        /* 0x0228 */
478     "WM_MDIGETACTIVE",          /* 0x0229 */
479
480     "WM_DROPOBJECT",
481     "WM_QUERYDROPOBJECT",
482     "WM_BEGINDRAG",
483     "WM_DRAGLOOP",
484     "WM_DRAGSELECT",
485     "WM_DRAGMOVE",
486
487     /* 0x0230*/
488     "WM_MDISETMENU",            /* 0x0230 */
489     "WM_ENTERSIZEMOVE",         /* 0x0231 */
490     "WM_EXITSIZEMOVE",          /* 0x0232 */
491     "WM_DROPFILES",             /* 0x0233 */
492     "WM_MDIREFRESHMENU", NULL, NULL, NULL,
493     /* 0x0238*/
494     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
495
496     /* 0x0240 */
497     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
498     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
499
500     /* 0x0250 */
501     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
502     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503
504     /* 0x0260 */
505     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
506     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
507     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
508     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
509
510     /* 0x0280 */
511     NULL,
512     "WM_IME_SETCONTEXT",        /* 0x0281 */
513     "WM_IME_NOTIFY",            /* 0x0282 */
514     "WM_IME_CONTROL",           /* 0x0283 */
515     "WM_IME_COMPOSITIONFULL",   /* 0x0284 */
516     "WM_IME_SELECT",            /* 0x0285 */
517     "WM_IME_CHAR",              /* 0x0286 */
518     NULL,
519     "WM_IME_REQUEST",           /* 0x0288 */
520     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
521     "WM_IME_KEYDOWN",           /* 0x0290 */
522     "WM_IME_KEYUP",             /* 0x0291 */
523     NULL, NULL, NULL, NULL, NULL, NULL,
524     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
525
526     /* 0x02a0 */
527     "WM_NCMOUSEHOVER",          /* 0x02A0 */
528     "WM_MOUSEHOVER",            /* 0x02A1 */
529     "WM_NCMOUSELEAVE",          /* 0x02A2 */
530     "WM_MOUSELEAVE",            /* 0x02A3 */
531     NULL, NULL, NULL, NULL, NULL, NULL,
532     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
533     "WM_WTSSESSION_CHANGE",     /* 0x02B1 */
534     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
535     NULL, NULL, NULL, NULL, NULL, NULL,
536
537     /* 0x02c0 */
538     "WM_TABLET_FIRST",          /* 0x02c0 */
539     "WM_TABLET_FIRST+1",        /* 0x02c1 */
540     "WM_TABLET_FIRST+2",        /* 0x02c2 */
541     "WM_TABLET_FIRST+3",        /* 0x02c3 */
542     "WM_TABLET_FIRST+4",        /* 0x02c4 */
543     "WM_TABLET_FIRST+5",        /* 0x02c5 */
544     "WM_TABLET_FIRST+7",        /* 0x02c6 */
545     "WM_TABLET_FIRST+8",        /* 0x02c7 */
546     "WM_TABLET_FIRST+9",        /* 0x02c8 */
547     "WM_TABLET_FIRST+10",       /* 0x02c9 */
548     "WM_TABLET_FIRST+11",       /* 0x02ca */
549     "WM_TABLET_FIRST+12",       /* 0x02cb */
550     "WM_TABLET_FIRST+13",       /* 0x02cc */
551     "WM_TABLET_FIRST+14",       /* 0x02cd */
552     "WM_TABLET_FIRST+15",       /* 0x02ce */
553     "WM_TABLET_FIRST+16",       /* 0x02cf */
554     "WM_TABLET_FIRST+17",       /* 0x02d0 */
555     "WM_TABLET_FIRST+18",       /* 0x02d1 */
556     "WM_TABLET_FIRST+19",       /* 0x02d2 */
557     "WM_TABLET_FIRST+20",       /* 0x02d3 */
558     "WM_TABLET_FIRST+21",       /* 0x02d4 */
559     "WM_TABLET_FIRST+22",       /* 0x02d5 */
560     "WM_TABLET_FIRST+23",       /* 0x02d6 */
561     "WM_TABLET_FIRST+24",       /* 0x02d7 */
562     "WM_TABLET_FIRST+25",       /* 0x02d8 */
563     "WM_TABLET_FIRST+26",       /* 0x02d9 */
564     "WM_TABLET_FIRST+27",       /* 0x02da */
565     "WM_TABLET_FIRST+28",       /* 0x02db */
566     "WM_TABLET_FIRST+29",       /* 0x02dc */
567     "WM_TABLET_FIRST+30",       /* 0x02dd */
568     "WM_TABLET_FIRST+31",       /* 0x02de */
569     "WM_TABLET_LAST",           /* 0x02df */
570
571     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
572     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
573     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
574     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
575
576     "WM_CUT",                   /* 0x0300 */
577     "WM_COPY",
578     "WM_PASTE",
579     "WM_CLEAR",
580     "WM_UNDO",
581     "WM_RENDERFORMAT",
582     "WM_RENDERALLFORMATS",
583     "WM_DESTROYCLIPBOARD",
584     "WM_DRAWCLIPBOARD",
585     "WM_PAINTCLIPBOARD",
586     "WM_VSCROLLCLIPBOARD",
587     "WM_SIZECLIPBOARD",
588     "WM_ASKCBFORMATNAME",
589     "WM_CHANGECBCHAIN",
590     "WM_HSCROLLCLIPBOARD",
591     "WM_QUERYNEWPALETTE",       /* 0x030f*/
592
593     "WM_PALETTEISCHANGING",
594     "WM_PALETTECHANGED",
595     "WM_HOTKEY",                /* 0x0312 */
596     "WM_POPUPSYSTEMMENU",       /* 0x0313 */
597     NULL, NULL, NULL,
598     "WM_PRINT",                 /* 0x0317 */
599     "WM_PRINTCLIENT",           /* 0x0318 */
600     "WM_APPCOMMAND",            /* 0x0319 */
601     "WM_THEMECHANGED",          /* 0x031A */
602     NULL, NULL,
603     "WM_CLIPBOARDUPDATE",       /* 0x031D */
604     "WM_DWMCOMPOSITIONCHANGED", /* 0x031E */
605     "WM_DWMNCRENDERINGCHANGED", /* 0x031F */
606
607     "WM_DWMCOLORIZATIONCOLORCHANGED", /* 0x0320 */
608     "WM_DWMWINDOWMAXIMIZEDCHANGE", /* 0x0321 */
609     NULL, NULL, NULL, NULL, NULL, NULL,
610     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
611
612     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
613     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
614     "WM_GETTITLEBARINFOEX",     /* 0x033F */
615
616     /* 0x0340 */
617     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
618     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
619     /* 0x0350 */
620     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
621     "WM_HANDHELDFIRST",     /* 0x0358 */
622     "WM_HANDHELDFIRST+1",   /* 0x0359 */
623     "WM_HANDHELDFIRST+2",   /* 0x035A */
624     "WM_HANDHELDFIRST+3",   /* 0x035B */
625     "WM_HANDHELDFIRST+4",   /* 0x035C */
626     "WM_HANDHELDFIRST+5",   /* 0x035D */
627     "WM_HANDHELDFIRST+6",   /* 0x035E */
628     "WM_HANDHELDLAST",      /* 0x035F */
629
630     "WM_QUERYAFXWNDPROC",   /*  0x0360 WM_AFXFIRST */
631     "WM_SIZEPARENT",        /*  0x0361 */
632     "WM_SETMESSAGESTRING",  /*  0x0362 */
633     "WM_IDLEUPDATECMDUI",   /*  0x0363 */
634     "WM_INITIALUPDATE",     /*  0x0364 */
635     "WM_COMMANDHELP",       /*  0x0365 */
636     "WM_HELPHITTEST",       /*  0x0366 */
637     "WM_EXITHELPMODE",      /*  0x0367 */
638     "WM_RECALCPARENT",      /*  0x0368 */
639     "WM_SIZECHILD",         /*  0x0369 */
640     "WM_KICKIDLE",          /*  0x036A */
641     "WM_QUERYCENTERWND",    /*  0x036B */
642     "WM_DISABLEMODAL",      /*  0x036C */
643     "WM_FLOATSTATUS",       /*  0x036D */
644     "WM_ACTIVATETOPLEVEL",  /*  0x036E */
645     "WM_QUERY3DCONTROLS",   /*  0x036F */
646     NULL,NULL,NULL,
647     "WM_SOCKET_NOTIFY",     /*  0x0373 */
648     "WM_SOCKET_DEAD",       /*  0x0374 */
649     "WM_POPMESSAGESTRING",  /*  0x0375 */
650     "WM_OCC_LOADFROMSTREAM",     /* 0x0376 */
651     "WM_OCC_LOADFROMSTORAGE",    /* 0x0377 */
652     "WM_OCC_INITNEW",            /* 0x0378 */
653     "WM_QUEUE_SENTINEL",         /* 0x0379 */
654     "WM_OCC_LOADFROMSTREAM_EX",  /* 0x037A */
655     "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
656
657     NULL,NULL,NULL,
658     "WM_AFXLAST",               /* 0x037F */
659
660     "WM_PENWINFIRST",           /* 0x0380 */
661     "WM_RCRESULT",              /* 0x0381 */
662     "WM_HOOKRCRESULT",          /* 0x0382 */
663     "WM_GLOBALRCCHANGE",        /* 0x0383 */
664     "WM_SKB",                   /* 0x0384 */
665     "WM_HEDITCTL",              /* 0x0385 */
666     NULL, NULL,
667     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
668     "WM_PENWINLAST",            /* 0x038F */
669
670     "WM_COALESCE_FIRST",        /* 0x0390 */
671     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
672     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
673     "WM_COALESCE_LAST",         /* 0x039F */
674
675     /* 0x03a0 */
676     "MM_JOY1MOVE",
677     "MM_JOY2MOVE",
678     "MM_JOY1ZMOVE",
679     "MM_JOY2ZMOVE",
680                             NULL, NULL, NULL, NULL,
681     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
682
683     /* 0x03b0 */
684     NULL, NULL, NULL, NULL, NULL,
685     "MM_JOY1BUTTONDOWN",
686     "MM_JOY2BUTTONDOWN",
687     "MM_JOY1BUTTONUP",
688     "MM_JOY2BUTTONUP",
689     "MM_MCINOTIFY",
690                 NULL,
691     "MM_WOM_OPEN",
692     "MM_WOM_CLOSE",
693     "MM_WOM_DONE",
694     "MM_WIM_OPEN",
695     "MM_WIM_CLOSE",
696
697     /* 0x03c0 */
698     "MM_WIM_DATA",
699     "MM_MIM_OPEN",
700     "MM_MIM_CLOSE",
701     "MM_MIM_DATA",
702     "MM_MIM_LONGDATA",
703     "MM_MIM_ERROR",
704     "MM_MIM_LONGERROR",
705     "MM_MOM_OPEN",
706     "MM_MOM_CLOSE",
707     "MM_MOM_DONE",
708                 NULL, NULL, NULL, NULL, NULL, NULL,
709     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
710     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
711
712     /* 0x03e0 */
713     "WM_DDE_INITIATE",  /* 0x3E0 */
714     "WM_DDE_TERMINATE", /* 0x3E1 */
715     "WM_DDE_ADVISE",    /* 0x3E2 */
716     "WM_DDE_UNADVISE",  /* 0x3E3 */
717     "WM_DDE_ACK",       /* 0x3E4 */
718     "WM_DDE_DATA",      /* 0x3E5 */
719     "WM_DDE_REQUEST",   /* 0x3E6 */
720     "WM_DDE_POKE",      /* 0x3E7 */
721     "WM_DDE_EXECUTE",   /* 0x3E8 */
722     NULL, NULL, NULL, NULL, NULL, NULL, NULL,
723
724
725     /* 0x03f0 */
726     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
727     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
728
729     "WM_USER"                   /* 0x0400 */
730 };
731
732
733 #define SPY_MAX_LVMMSGNUM   182
734 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
735 {
736     "LVM_GETBKCOLOR",           /* 1000 */
737     "LVM_SETBKCOLOR",
738     "LVM_GETIMAGELIST",
739     "LVM_SETIMAGELIST",
740     "LVM_GETITEMCOUNT",
741     "LVM_GETITEMA",
742     "LVM_SETITEMA",
743     "LVM_INSERTITEMA",
744     "LVM_DELETEITEM",
745     "LVM_DELETEALLITEMS",
746     "LVM_GETCALLBACKMASK",
747     "LVM_SETCALLBACKMASK",
748     "LVM_GETNEXTITEM",
749     "LVM_FINDITEMA",
750     "LVM_GETITEMRECT",
751     "LVM_SETITEMPOSITION",
752     "LVM_GETITEMPOSITION",
753     "LVM_GETSTRINGWIDTHA",
754     "LVM_HITTEST",
755     "LVM_ENSUREVISIBLE",
756     "LVM_SCROLL",
757     "LVM_REDRAWITEMS",
758     "LVM_ARRANGE",
759     "LVM_EDITLABELA",
760     "LVM_GETEDITCONTROL",
761     "LVM_GETCOLUMNA",
762     "LVM_SETCOLUMNA",
763     "LVM_INSERTCOLUMNA",
764     "LVM_DELETECOLUMN",
765     "LVM_GETCOLUMNWIDTH",
766     "LVM_SETCOLUMNWIDTH",
767     "LVM_GETHEADER",
768     NULL,
769     "LVM_CREATEDRAGIMAGE",
770     "LVM_GETVIEWRECT",
771     "LVM_GETTEXTCOLOR",
772     "LVM_SETTEXTCOLOR",
773     "LVM_GETTEXTBKCOLOR",
774     "LVM_SETTEXTBKCOLOR",
775     "LVM_GETTOPINDEX",
776     "LVM_GETCOUNTPERPAGE",
777     "LVM_GETORIGIN",
778     "LVM_UPDATE",
779     "LVM_SETITEMSTATE",
780     "LVM_GETITEMSTATE",
781     "LVM_GETITEMTEXTA",
782     "LVM_SETITEMTEXTA",
783     "LVM_SETITEMCOUNT",
784     "LVM_SORTITEMS",
785     "LVM_SETITEMPOSITION32",
786     "LVM_GETSELECTEDCOUNT",
787     "LVM_GETITEMSPACING",
788     "LVM_GETISEARCHSTRINGA",
789     "LVM_SETICONSPACING",
790     "LVM_SETEXTENDEDLISTVIEWSTYLE",
791     "LVM_GETEXTENDEDLISTVIEWSTYLE",
792     "LVM_GETSUBITEMRECT",
793     "LVM_SUBITEMHITTEST",
794     "LVM_SETCOLUMNORDERARRAY",
795     "LVM_GETCOLUMNORDERARRAY",
796     "LVM_SETHOTITEM",
797     "LVM_GETHOTITEM",
798     "LVM_SETHOTCURSOR",
799     "LVM_GETHOTCURSOR",
800     "LVM_APPROXIMATEVIEWRECT",
801     "LVM_SETWORKAREAS",
802     "LVM_GETSELECTIONMARK",
803     "LVM_SETSELECTIONMARK",
804     "LVM_SETBKIMAGEA",
805     "LVM_GETBKIMAGEA",
806     "LVM_GETWORKAREAS",
807     "LVM_SETHOVERTIME",
808     "LVM_GETHOVERTIME",
809     "LVM_GETNUMBEROFWORKAREAS",
810     "LVM_SETTOOLTIPS",
811     "LVM_GETITEMW",
812     "LVM_SETITEMW",
813     "LVM_INSERTITEMW",
814     "LVM_GETTOOLTIPS",
815     NULL,
816     NULL,
817     NULL,
818     NULL,
819     "LVM_FINDITEMW",
820     NULL,
821     NULL,
822     NULL,
823     "LVM_GETSTRINGWIDTHW",
824     NULL,
825     NULL,
826     NULL,
827     NULL,
828     NULL,
829     NULL,
830     NULL,
831     "LVM_GETCOLUMNW",
832     "LVM_SETCOLUMNW",
833     "LVM_INSERTCOLUMNW",
834     NULL,
835     NULL,
836     NULL,
837     NULL,
838     NULL,
839     NULL,
840     NULL,
841     NULL,
842     NULL,
843     NULL,
844     NULL,
845     NULL,
846     NULL,
847     NULL,
848     NULL,
849     NULL,
850     NULL,
851     "LVM_GETITEMTEXTW",
852     "LVM_SETITEMTEXTW",
853     "LVM_GETISEARCHSTRINGW",
854     "LVM_EDITLABELW",
855     NULL,
856     NULL,
857     NULL,
858     NULL,
859     NULL,
860     NULL,
861     NULL,
862     NULL,
863     NULL,
864     NULL,
865     NULL,
866     NULL,
867     NULL,
868     NULL,
869     NULL,
870     NULL,
871     NULL,
872     NULL,
873     NULL,
874     "LVM_SETBKIMAGEW",
875     "LVM_GETBKIMAGEW",   /* 0x108B */
876     "LVM_SETSELECTEDCOLUMN",
877     "LVM_SETTILEWIDTH",
878     "LVM_SETVIEW",
879     "LVM_GETVIEW",
880     NULL,
881     "LVM_INSERTGROUP",
882     NULL,
883     "LVM_SETGROUPINFO",
884     NULL,
885     "LVM_GETGROUPINFO",
886     "LVM_REMOVEGROUP",
887     "LVM_MOVEGROUP",
888     NULL,
889     NULL,
890     "LVM_MOVEITEMTOGROUP",
891     "LVM_SETGROUPMETRICS",
892     "LVM_GETGROUPMETRICS",
893     "LVM_ENABLEGROUPVIEW",
894     "LVM_SORTGROUPS",
895     "LVM_INSERTGROUPSORTED",
896     "LVM_REMOVEALLGROUPS",
897     "LVM_HASGROUP",
898     "LVM_SETTILEVIEWINFO",
899     "LVM_GETTILEVIEWINFO",
900     "LVM_SETTILEINFO",
901     "LVM_GETTILEINFO",
902     "LVM_SETINSERTMARK",
903     "LVM_GETINSERTMARK",
904     "LVM_INSERTMARKHITTEST",
905     "LVM_GETINSERTMARKRECT",
906     "LVM_SETINSERTMARKCOLOR",
907     "LVM_GETINSERTMARKCOLOR",
908     NULL,
909     "LVM_SETINFOTIP",
910     "LVM_GETSELECTEDCOLUMN",
911     "LVM_ISGROUPVIEWENABLED",
912     "LVM_GETOUTLINECOLOR",
913     "LVM_SETOUTLINECOLOR",
914     NULL,
915     "LVM_CANCELEDITLABEL",
916     "LVM_MAPINDEXTOID",
917     "LVM_MAPIDTOINDEX",
918     "LVM_ISITEMVISIBLE"
919 };
920
921
922 #define SPY_MAX_TVMSGNUM   65
923 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
924 {
925     "TVM_INSERTITEMA",          /* 1100 */
926     "TVM_DELETEITEM",
927     "TVM_EXPAND",
928     NULL,
929     "TVM_GETITEMRECT",
930     "TVM_GETCOUNT",
931     "TVM_GETINDENT",
932     "TVM_SETINDENT",
933     "TVM_GETIMAGELIST",
934     "TVM_SETIMAGELIST",
935     "TVM_GETNEXTITEM",
936     "TVM_SELECTITEM",
937     "TVM_GETITEMA",
938     "TVM_SETITEMA",
939     "TVM_EDITLABELA",
940     "TVM_GETEDITCONTROL",
941     "TVM_GETVISIBLECOUNT",
942     "TVM_HITTEST",
943     "TVM_CREATEDRAGIMAGE",
944     "TVM_SORTCHILDREN",
945     "TVM_ENSUREVISIBLE",
946     "TVM_SORTCHILDRENCB",
947     "TVM_ENDEDITLABELNOW",
948     "TVM_GETISEARCHSTRINGA",
949     "TVM_SETTOOLTIPS",
950     "TVM_GETTOOLTIPS",
951     "TVM_SETINSERTMARK",
952     "TVM_SETITEMHEIGHT",
953     "TVM_GETITEMHEIGHT",
954     "TVM_SETBKCOLOR",
955     "TVM_SETTEXTCOLOR",
956     "TVM_GETBKCOLOR",
957     "TVM_GETTEXTCOLOR",
958     "TVM_SETSCROLLTIME",
959     "TVM_GETSCROLLTIME",
960     "TVM_UNKNOWN35",
961     "TVM_UNKNOWN36",
962     "TVM_SETINSERTMARKCOLOR",
963     "TVM_GETINSERTMARKCOLOR",
964     "TVM_GETITEMSTATE",
965     "TVM_SETLINECOLOR",
966     "TVM_GETLINECOLOR",
967     NULL,
968     NULL,
969     NULL,
970     NULL,
971     NULL,
972     NULL,
973     NULL,
974     NULL,
975     "TVM_INSERTITEMW",
976     NULL,
977     NULL,
978     NULL,
979     NULL,
980     NULL,
981     NULL,
982     NULL,
983     NULL,
984     NULL,
985     NULL,
986     NULL,
987     "TVM_GETITEMW",
988     "TVM_SETITEMW",
989     "TVM_GETISEARCHSTRINGW",
990     "TVM_EDITLABELW"
991 };
992
993
994 #define SPY_MAX_HDMMSGNUM   19
995 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
996 {
997     "HDM_GETITEMCOUNT",         /* 1200 */
998     "HDM_INSERTITEMA",
999     "HDM_DELETEITEM",
1000     "HDM_GETITEMA",
1001     "HDM_SETITEMA",
1002     "HDM_LAYOUT",
1003     "HDM_HITTEST",
1004     "HDM_GETITEMRECT",
1005     "HDM_SETIMAGELIST",
1006     "HDM_GETIMAGELIST",
1007     "HDM_INSERTITEMW",
1008     "HDM_GETITEMW",
1009     "HDM_SETITEMW",
1010     NULL,
1011     NULL,
1012     "HDM_ORDERTOINDEX",
1013     "HDM_CREATEDRAGIMAGE",
1014     "GETORDERARRAYINDEX",
1015     "SETORDERARRAYINDEX",
1016     "SETHOTDIVIDER"
1017 };
1018
1019
1020 #define SPY_MAX_TCMMSGNUM   62
1021 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
1022 {
1023     NULL,               /* 1300 */
1024     NULL,
1025     "TCM_SETIMAGELIST",
1026     "TCM_GETIMAGELIST",
1027     "TCM_GETITEMCOUNT",
1028     "TCM_GETITEMA",
1029     "TCM_SETITEMA",
1030     "TCM_INSERTITEMA",
1031     "TCM_DELETEITEM",
1032     "TCM_DELETEALLITEMS",
1033     "TCM_GETITEMRECT",
1034     "TCM_GETCURSEL",
1035     "TCM_SETCURSEL",
1036     "TCM_HITTEST",
1037     "TCM_SETITEMEXTRA",
1038     NULL,
1039     NULL,
1040     NULL,
1041     NULL,
1042     NULL,
1043     NULL,
1044     NULL,
1045     NULL,
1046     NULL,
1047     NULL,
1048     NULL,
1049     NULL,
1050     NULL,
1051     NULL,
1052     NULL,
1053     NULL,
1054     NULL,
1055     NULL,
1056     NULL,
1057     NULL,
1058     NULL,
1059     NULL,
1060     NULL,
1061     NULL,
1062     NULL,
1063     "TCM_ADJUSTRECT",
1064     "TCM_SETITEMSIZE",
1065     "TCM_REMOVEIMAGE",
1066     "TCM_SETPADDING",
1067     "TCM_GETROWCOUNT",
1068     "TCM_GETTOOLTIPS",
1069     "TCM_SETTOOLTIPS",
1070     "TCM_GETCURFOCUS",
1071     "TCM_SETCURFOCUS",
1072     "TCM_SETMINTABWIDTH",
1073     "TCM_DESELECTALL",
1074     "TCM_HIGHLIGHTITEM",
1075     "TCM_SETEXTENDEDSTYLE",
1076     "TCM_GETEXTENDEDSTYLE",
1077     NULL,
1078     NULL,
1079     NULL,
1080     NULL,
1081     NULL,
1082     NULL,
1083     "TCM_GETITEMW",
1084     "TCM_SETITEMW",
1085     "TCM_INSERTITEMW"
1086 };
1087
1088 #define SPY_MAX_PGMMSGNUM   13
1089 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
1090 {
1091     NULL,               /* 1400 */
1092     "PGM_SETCHILD",
1093     "PGM_RECALCSIZE",
1094     "PGM_FORWARDMOUSE",
1095     "PGM_SETBKCOLOR",
1096     "PGM_GETBKCOLOR",
1097     "PGM_SETBORDER",
1098     "PGM_GETBORDER",
1099     "PGM_SETPOS",
1100     "PGM_GETPOS",
1101     "PGM_SETBUTTONSIZE",
1102     "PGM_GETBUTTONSIZE",
1103     "PGM_GETBUTTONSTATE",
1104     "PGM_GETDROPTARGET"
1105 };
1106
1107
1108 #define SPY_MAX_CCMMSGNUM   9
1109 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
1110 {
1111     NULL,               /* 0x2000 */
1112     "CCM_SETBKCOLOR",
1113     "CCM_SETCOLORSCHEME",
1114     "CCM_GETCOLORSCHEME",
1115     "CCM_GETDROPTARGET",
1116     "CCM_SETUNICODEFORMAT",
1117     "CCM_GETUNICODEFORMAT",
1118     "CCM_SETVERSION",
1119     "CCM_GETVERSION",
1120     "CCM_SETNOTIFYWINDOW"
1121 };
1122
1123 #define SPY_MAX_WINEMSGNUM   (WM_WINE_MOUSE_LL_HOOK - WM_WINE_DESTROYWINDOW)
1124 static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
1125 {
1126     "WM_WINE_DESTROYWINDOW",
1127     "WM_WINE_SETWINDOWPOS",
1128     "WM_WINE_SHOWWINDOW",
1129     "WM_WINE_SETPARENT",
1130     "WM_WINE_SETWINDOWLONG",
1131     "WM_WINE_ENABLEWINDOW",
1132     "WM_WINE_SETACTIVEWINDOW",
1133     "WM_WINE_KEYBOARD_LL_HOOK",
1134     "WM_WINE_MOUSE_LL_HOOK",
1135 };
1136
1137 /* Virtual key names */
1138 #define SPY_MAX_VKKEYSNUM 255
1139 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
1140 {
1141     NULL,               /* 0x00 */
1142     "VK_LBUTTON",       /* 0x01 */
1143     "VK_RBUTTON",       /* 0x02 */
1144     "VK_CANCEL",        /* 0x03 */
1145     "VK_MBUTTON",       /* 0x04 */
1146     "VK_XBUTTON1",      /* 0x05 */
1147     "VK_XBUTTON2",      /* 0x06 */
1148     NULL,               /* 0x07 */
1149     "VK_BACK",          /* 0x08 */
1150     "VK_TAB",           /* 0x09 */
1151     NULL,               /* 0x0A */
1152     NULL,               /* 0x0B */
1153     "VK_CLEAR",         /* 0x0C */
1154     "VK_RETURN",        /* 0x0D */
1155     NULL,               /* 0x0E */
1156     NULL,               /* 0x0F */
1157     "VK_SHIFT",         /* 0x10 */
1158     "VK_CONTROL",       /* 0x11 */
1159     "VK_MENU",          /* 0x12 */
1160     "VK_PAUSE",         /* 0x13 */
1161     "VK_CAPITAL",       /* 0x14 */
1162     NULL,               /* 0x15 */
1163     NULL,               /* 0x16 */
1164     NULL,               /* 0x17 */
1165     NULL,               /* 0x18 */
1166     NULL,               /* 0x19 */
1167     NULL,               /* 0x1A */
1168     "VK_ESCAPE",        /* 0x1B */
1169     "VK_CONVERT",       /* 0x1C */
1170     "VK_NONCONVERT",    /* 0x1D */
1171     "VK_ACCEPT",        /* 0x1E */
1172     "VK_MODECHANGE",    /* 0x1F */
1173     "VK_SPACE",         /* 0x20 */
1174     "VK_PRIOR",         /* 0x21 */
1175     "VK_NEXT",          /* 0x22 */
1176     "VK_END",           /* 0x23 */
1177     "VK_HOME",          /* 0x24 */
1178     "VK_LEFT",          /* 0x25 */
1179     "VK_UP",            /* 0x26 */
1180     "VK_RIGHT",         /* 0x27 */
1181     "VK_DOWN",          /* 0x28 */
1182     "VK_SELECT",        /* 0x29 */
1183     "VK_PRINT",         /* 0x2A */
1184     "VK_EXECUTE",       /* 0x2B */
1185     "VK_SNAPSHOT",      /* 0x2C */
1186     "VK_INSERT",        /* 0x2D */
1187     "VK_DELETE",        /* 0x2E */
1188     "VK_HELP",          /* 0x2F */
1189     "VK_0",             /* 0x30 */
1190     "VK_1",             /* 0x31 */
1191     "VK_2",             /* 0x32 */
1192     "VK_3",             /* 0x33 */
1193     "VK_4",             /* 0x34 */
1194     "VK_5",             /* 0x35 */
1195     "VK_6",             /* 0x36 */
1196     "VK_7",             /* 0x37 */
1197     "VK_8",             /* 0x38 */
1198     "VK_9",             /* 0x39 */
1199     NULL,               /* 0x3A */
1200     NULL,               /* 0x3B */
1201     NULL,               /* 0x3C */
1202     NULL,               /* 0x3D */
1203     NULL,               /* 0x3E */
1204     NULL,               /* 0x3F */
1205     NULL,               /* 0x40 */
1206     "VK_A",             /* 0x41 */
1207     "VK_B",             /* 0x42 */
1208     "VK_C",             /* 0x43 */
1209     "VK_D",             /* 0x44 */
1210     "VK_E",             /* 0x45 */
1211     "VK_F",             /* 0x46 */
1212     "VK_G",             /* 0x47 */
1213     "VK_H",             /* 0x48 */
1214     "VK_I",             /* 0x49 */
1215     "VK_J",             /* 0x4A */
1216     "VK_K",             /* 0x4B */
1217     "VK_L",             /* 0x4C */
1218     "VK_M",             /* 0x4D */
1219     "VK_N",             /* 0x4E */
1220     "VK_O",             /* 0x4F */
1221     "VK_P",             /* 0x50 */
1222     "VK_Q",             /* 0x51 */
1223     "VK_R",             /* 0x52 */
1224     "VK_S",             /* 0x53 */
1225     "VK_T",             /* 0x54 */
1226     "VK_U",             /* 0x55 */
1227     "VK_V",             /* 0x56 */
1228     "VK_W",             /* 0x57 */
1229     "VK_X",             /* 0x58 */
1230     "VK_Y",             /* 0x59 */
1231     "VK_Z",             /* 0x5A */
1232     "VK_LWIN",          /* 0x5B */
1233     "VK_RWIN",          /* 0x5C */
1234     "VK_APPS",          /* 0x5D */
1235     NULL,               /* 0x5E */
1236     "VK_SLEEP",         /* 0x5F */
1237     "VK_NUMPAD0",       /* 0x60 */
1238     "VK_NUMPAD1",       /* 0x61 */
1239     "VK_NUMPAD2",       /* 0x62 */
1240     "VK_NUMPAD3",       /* 0x63 */
1241     "VK_NUMPAD4",       /* 0x64 */
1242     "VK_NUMPAD5",       /* 0x65 */
1243     "VK_NUMPAD6",       /* 0x66 */
1244     "VK_NUMPAD7",       /* 0x67 */
1245     "VK_NUMPAD8",       /* 0x68 */
1246     "VK_NUMPAD9",       /* 0x69 */
1247     "VK_MULTIPLY",      /* 0x6A */
1248     "VK_ADD",           /* 0x6B */
1249     "VK_SEPARATOR",     /* 0x6C */
1250     "VK_SUBTRACT",      /* 0x6D */
1251     "VK_DECIMAL",       /* 0x6E */
1252     "VK_DIVIDE",        /* 0x6F */
1253     "VK_F1",            /* 0x70 */
1254     "VK_F2",            /* 0x71 */
1255     "VK_F3",            /* 0x72 */
1256     "VK_F4",            /* 0x73 */
1257     "VK_F5",            /* 0x74 */
1258     "VK_F6",            /* 0x75 */
1259     "VK_F7",            /* 0x76 */
1260     "VK_F8",            /* 0x77 */
1261     "VK_F9",            /* 0x78 */
1262     "VK_F10",           /* 0x79 */
1263     "VK_F11",           /* 0x7A */
1264     "VK_F12",           /* 0x7B */
1265     "VK_F13",           /* 0x7C */
1266     "VK_F14",           /* 0x7D */
1267     "VK_F15",           /* 0x7E */
1268     "VK_F16",           /* 0x7F */
1269     "VK_F17",           /* 0x80 */
1270     "VK_F18",           /* 0x81 */
1271     "VK_F19",           /* 0x82 */
1272     "VK_F20",           /* 0x83 */
1273     "VK_F21",           /* 0x84 */
1274     "VK_F22",           /* 0x85 */
1275     "VK_F23",           /* 0x86 */
1276     "VK_F24",           /* 0x87 */
1277     NULL,               /* 0x88 */
1278     NULL,               /* 0x89 */
1279     NULL,               /* 0x8A */
1280     NULL,               /* 0x8B */
1281     NULL,               /* 0x8C */
1282     NULL,               /* 0x8D */
1283     NULL,               /* 0x8E */
1284     NULL,               /* 0x8F */
1285     "VK_NUMLOCK",       /* 0x90 */
1286     "VK_SCROLL",        /* 0x91 */
1287     "VK_OEM_NEC_EQUAL",       /* 0x92 aka. VK_OEM_FJ_JISHO */
1288     "VK_OEM_FJ_MASSHOU",      /* 0x93 */
1289     "VK_OEM_FJ_TOUROKU",      /* 0x94 */
1290     "VK_OEM_FJ_LOYA",         /* 0x95 */
1291     "VK_OEM_FJ_ROYA",         /* 0x96 */
1292     NULL,               /* 0x97 */
1293     NULL,               /* 0x98 */
1294     NULL,               /* 0x99 */
1295     NULL,               /* 0x9A */
1296     NULL,               /* 0x9B */
1297     NULL,               /* 0x9C */
1298     NULL,               /* 0x9D */
1299     NULL,               /* 0x9E */
1300     NULL,               /* 0x9F */
1301     "VK_LSHIFT",        /* 0xA0 */
1302     "VK_RSHIFT",        /* 0xA1 */
1303     "VK_LCONTROL",      /* 0xA2 */
1304     "VK_RCONTROL",      /* 0xA3 */
1305     "VK_LMENU",         /* 0xA4 */
1306     "VK_RMENU",         /* 0xA5 */
1307     "VK_BROWSER_BACK",        /* 0xA6 */
1308     "VK_BROWSER_FORWARD",     /* 0xA7 */
1309     "VK_BROWSER_REFRESH",     /* 0xA8 */
1310     "VK_BROWSER_STOP",        /* 0xA9 */
1311     "VK_BROWSER_SEARCH",      /* 0xAA */
1312     "VK_BROWSER_FAVORITES",   /* 0xAB */
1313     "VK_BROWSER_HOME",        /* 0xAC */
1314     "VK_VOLUME_MUTE",         /* 0xAD */
1315     "VK_VOLUME_DOWN",         /* 0xAE */
1316     "VK_VOLUME_UP",           /* 0xAF */
1317     "VK_MEDIA_NEXT_TRACK",    /* 0xB0 */
1318     "VK_MEDIA_PREV_TRACK",    /* 0xB1 */
1319     "VK_MEDIA_STOP",          /* 0xB2 */
1320     "VK_MEDIA_PLAY_PAUSE",    /* 0xB3 */
1321     "VK_LAUNCH_MAIL",         /* 0xB4 */
1322     "VK_LAUNCH_MEDIA_SELECT", /* 0xB5 */
1323     "VK_LAUNCH_APP1",         /* 0xB6 */
1324     "VK_LAUNCH_APP2",         /* 0xB7 */
1325     NULL,               /* 0xB8 */
1326     NULL,               /* 0xB9 */
1327     "VK_OEM_1",         /* 0xBA */
1328     "VK_OEM_PLUS",      /* 0xBB */
1329     "VK_OEM_COMMA",     /* 0xBC */
1330     "VK_OEM_MINUS",     /* 0xBD */
1331     "VK_OEM_PERIOD",    /* 0xBE */
1332     "VK_OEM_2",         /* 0xBF */
1333     "VK_OEM_3",         /* 0xC0 */
1334     NULL,               /* 0xC1 */
1335     NULL,               /* 0xC2 */
1336     NULL,               /* 0xC3 */
1337     NULL,               /* 0xC4 */
1338     NULL,               /* 0xC5 */
1339     NULL,               /* 0xC6 */
1340     NULL,               /* 0xC7 */
1341     NULL,               /* 0xC8 */
1342     NULL,               /* 0xC9 */
1343     NULL,               /* 0xCA */
1344     NULL,               /* 0xCB */
1345     NULL,               /* 0xCC */
1346     NULL,               /* 0xCD */
1347     NULL,               /* 0xCE */
1348     NULL,               /* 0xCF */
1349     NULL,               /* 0xD0 */
1350     NULL,               /* 0xD1 */
1351     NULL,               /* 0xD2 */
1352     NULL,               /* 0xD3 */
1353     NULL,               /* 0xD4 */
1354     NULL,               /* 0xD5 */
1355     NULL,               /* 0xD6 */
1356     NULL,               /* 0xD7 */
1357     NULL,               /* 0xD8 */
1358     NULL,               /* 0xD9 */
1359     NULL,               /* 0xDA */
1360     "VK_OEM_4",         /* 0xDB */
1361     "VK_OEM_5",         /* 0xDC */
1362     "VK_OEM_6",         /* 0xDD */
1363     "VK_OEM_7",         /* 0xDE */
1364     "VK_OEM_8",         /* 0xDF */
1365     NULL,               /* 0xE0 */
1366     "VK_OEM_AX",        /* 0xE1 */
1367     "VK_OEM_102",       /* 0xE2 */
1368     "VK_ICO_HELP",      /* 0xE3 */
1369     "VK_ICO_00",        /* 0xE4 */
1370     "VK_PROCESSKEY",    /* 0xE5 */
1371     NULL,               /* 0xE6 */
1372     "VK_PACKET",        /* 0xE7 */
1373     NULL,               /* 0xE8 */
1374     NULL,               /* 0xE9 */
1375     NULL,               /* 0xEA */
1376     NULL,               /* 0xEB */
1377     NULL,               /* 0xEC */
1378     NULL,               /* 0xED */
1379     NULL,               /* 0xEE */
1380     NULL,               /* 0xEF */
1381     NULL,               /* 0xF0 */
1382     NULL,               /* 0xF1 */
1383     NULL,               /* 0xF2 */
1384     NULL,               /* 0xF3 */
1385     NULL,               /* 0xF4 */
1386     NULL,               /* 0xF5 */
1387     "VK_ATTN",          /* 0xF6 */
1388     "VK_CRSEL",         /* 0xF7 */
1389     "VK_EXSEL",         /* 0xF8 */
1390     "VK_EREOF",         /* 0xF9 */
1391     "VK_PLAY",          /* 0xFA */
1392     "VK_ZOOM",          /* 0xFB */
1393     "VK_NONAME",        /* 0xFC */
1394     "VK_PA1",           /* 0xFD */
1395     "VK_OEM_CLEAR",     /* 0xFE */
1396     NULL                /* 0xFF */
1397 };
1398
1399
1400 /************************************************************************/
1401
1402
1403 /* WM_USER+n message values for "common controls" */
1404
1405 typedef struct
1406 {
1407     const char *name;      /* name of control message           */
1408     UINT        value;     /* message number (0x0401-0x0fff     */
1409     UINT        len;       /* length of space at lParam to dump */
1410 } USER_MSG;
1411
1412
1413 typedef struct
1414 {
1415 const WCHAR      *classname;  /* class name to match                  */
1416 const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */
1417 const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */
1418 } CONTROL_CLASS;
1419
1420 #define USM(a,b) { #a ,a,b}
1421 #define SZOF(a)  sizeof(a)
1422
1423 /* To dump memory at the lParam for any of these messages,  */
1424 /* replace the "0" with a "SZOF(structure)", or with a      */
1425 /* number. (First method preferred.)                         */
1426
1427 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
1428
1429 static const USER_MSG rebar_array[] = {
1430           USM(RB_INSERTBANDA,          0),
1431           USM(RB_DELETEBAND,           0),
1432           USM(RB_GETBARINFO,           0),
1433           USM(RB_SETBARINFO,           0),
1434           USM(RB_GETBANDINFO_OLD,      0),
1435           USM(RB_SETBANDINFOA,         0),
1436           USM(RB_SETPARENT,            0),
1437           USM(RB_HITTEST,              0),
1438           USM(RB_GETRECT,              0),
1439           USM(RB_INSERTBANDW,          0),
1440           USM(RB_SETBANDINFOW,         0),
1441           USM(RB_GETBANDCOUNT,         0),
1442           USM(RB_GETROWCOUNT,          0),
1443           USM(RB_GETROWHEIGHT,         0),
1444           USM(RB_IDTOINDEX,            0),
1445           USM(RB_GETTOOLTIPS,          0),
1446           USM(RB_SETTOOLTIPS,          0),
1447           USM(RB_SETBKCOLOR,           0),
1448           USM(RB_GETBKCOLOR,           0),
1449           USM(RB_SETTEXTCOLOR,         0),
1450           USM(RB_GETTEXTCOLOR,         0),
1451           USM(RB_SIZETORECT,           0),
1452           USM(RB_BEGINDRAG,            0),
1453           USM(RB_ENDDRAG,              0),
1454           USM(RB_DRAGMOVE,             0),
1455           USM(RB_GETBARHEIGHT,         0),
1456           USM(RB_GETBANDINFOW,         0),
1457           USM(RB_GETBANDINFOA,         0),
1458           USM(RB_MINIMIZEBAND,         0),
1459           USM(RB_MAXIMIZEBAND,         0),
1460           USM(RB_GETBANDBORDERS,       0),
1461           USM(RB_SHOWBAND,             0),
1462           USM(RB_SETPALETTE,           0),
1463           USM(RB_GETPALETTE,           0),
1464           USM(RB_MOVEBAND,             0),
1465           {0,0,0} };
1466
1467 static const USER_MSG toolbar_array[] = {
1468           USM(TB_ENABLEBUTTON          ,0),
1469           USM(TB_CHECKBUTTON           ,0),
1470           USM(TB_PRESSBUTTON           ,0),
1471           USM(TB_HIDEBUTTON            ,0),
1472           USM(TB_INDETERMINATE         ,0),
1473           USM(TB_MARKBUTTON            ,0),
1474           USM(TB_ISBUTTONENABLED       ,0),
1475           USM(TB_ISBUTTONCHECKED       ,0),
1476           USM(TB_ISBUTTONPRESSED       ,0),
1477           USM(TB_ISBUTTONHIDDEN        ,0),
1478           USM(TB_ISBUTTONINDETERMINATE ,0),
1479           USM(TB_ISBUTTONHIGHLIGHTED   ,0),
1480           USM(TB_SETSTATE              ,0),
1481           USM(TB_GETSTATE              ,0),
1482           USM(TB_ADDBITMAP             ,0),
1483           USM(TB_ADDBUTTONSA           ,0),
1484           USM(TB_INSERTBUTTONA         ,0),
1485           USM(TB_DELETEBUTTON          ,0),
1486           USM(TB_GETBUTTON             ,0),
1487           USM(TB_BUTTONCOUNT           ,0),
1488           USM(TB_COMMANDTOINDEX        ,0),
1489           USM(TB_SAVERESTOREA          ,0),
1490           USM(TB_CUSTOMIZE             ,0),
1491           USM(TB_ADDSTRINGA            ,0),
1492           USM(TB_GETITEMRECT           ,0),
1493           USM(TB_BUTTONSTRUCTSIZE      ,0),
1494           USM(TB_SETBUTTONSIZE         ,0),
1495           USM(TB_SETBITMAPSIZE         ,0),
1496           USM(TB_AUTOSIZE              ,0),
1497           USM(TB_GETTOOLTIPS           ,0),
1498           USM(TB_SETTOOLTIPS           ,0),
1499           USM(TB_SETPARENT             ,0),
1500           USM(TB_SETROWS               ,0),
1501           USM(TB_GETROWS               ,0),
1502           USM(TB_GETBITMAPFLAGS        ,0),
1503           USM(TB_SETCMDID              ,0),
1504           USM(TB_CHANGEBITMAP          ,0),
1505           USM(TB_GETBITMAP             ,0),
1506           USM(TB_GETBUTTONTEXTA        ,0),
1507           USM(TB_REPLACEBITMAP         ,0),
1508           USM(TB_SETINDENT             ,0),
1509           USM(TB_SETIMAGELIST          ,0),
1510           USM(TB_GETIMAGELIST          ,0),
1511           USM(TB_LOADIMAGES            ,0),
1512           USM(TB_GETRECT               ,0),
1513           USM(TB_SETHOTIMAGELIST       ,0),
1514           USM(TB_GETHOTIMAGELIST       ,0),
1515           USM(TB_SETDISABLEDIMAGELIST  ,0),
1516           USM(TB_GETDISABLEDIMAGELIST  ,0),
1517           USM(TB_SETSTYLE              ,0),
1518           USM(TB_GETSTYLE              ,0),
1519           USM(TB_GETBUTTONSIZE         ,0),
1520           USM(TB_SETBUTTONWIDTH        ,0),
1521           USM(TB_SETMAXTEXTROWS        ,0),
1522           USM(TB_GETTEXTROWS           ,0),
1523           USM(TB_GETOBJECT             ,0),
1524           USM(TB_GETBUTTONINFOW        ,0),
1525           USM(TB_SETBUTTONINFOW        ,0),
1526           USM(TB_GETBUTTONINFOA        ,0),
1527           USM(TB_SETBUTTONINFOA        ,0),
1528           USM(TB_INSERTBUTTONW         ,0),
1529           USM(TB_ADDBUTTONSW           ,0),
1530           USM(TB_HITTEST               ,0),
1531           USM(TB_SETDRAWTEXTFLAGS      ,0),
1532           USM(TB_GETHOTITEM            ,0),
1533           USM(TB_SETHOTITEM            ,0),
1534           USM(TB_SETANCHORHIGHLIGHT    ,0),
1535           USM(TB_GETANCHORHIGHLIGHT    ,0),
1536           USM(TB_GETBUTTONTEXTW        ,0),
1537           USM(TB_SAVERESTOREW          ,0),
1538           USM(TB_ADDSTRINGW            ,0),
1539           USM(TB_MAPACCELERATORA       ,0),
1540           USM(TB_GETINSERTMARK         ,0),
1541           USM(TB_SETINSERTMARK         ,0),
1542           USM(TB_INSERTMARKHITTEST     ,0),
1543           USM(TB_MOVEBUTTON            ,0),
1544           USM(TB_GETMAXSIZE            ,0),
1545           USM(TB_SETEXTENDEDSTYLE      ,0),
1546           USM(TB_GETEXTENDEDSTYLE      ,0),
1547           USM(TB_GETPADDING            ,0),
1548           USM(TB_SETPADDING            ,0),
1549           USM(TB_SETINSERTMARKCOLOR    ,0),
1550           USM(TB_GETINSERTMARKCOLOR    ,0),
1551           USM(TB_MAPACCELERATORW       ,0),
1552           USM(TB_GETSTRINGW            ,0),
1553           USM(TB_GETSTRINGA            ,0),
1554           USM(TB_UNKWN45D              ,8),
1555           USM(TB_SETHOTITEM2           ,0),
1556           USM(TB_SETLISTGAP            ,0),
1557           USM(TB_GETIMAGELISTCOUNT     ,0),
1558           USM(TB_GETIDEALSIZE          ,8),
1559           USM(TB_UNKWN464              ,0),
1560           {0,0,0} };
1561
1562 static const USER_MSG tooltips_array[] = {
1563           USM(TTM_ACTIVATE             ,0),
1564           USM(TTM_SETDELAYTIME         ,0),
1565           USM(TTM_ADDTOOLA             ,0),
1566           USM(TTM_DELTOOLA             ,0),
1567           USM(TTM_NEWTOOLRECTA         ,0),
1568           USM(TTM_RELAYEVENT           ,0),
1569           USM(TTM_GETTOOLINFOA         ,0),
1570           USM(TTM_HITTESTA             ,0),
1571           USM(TTM_GETTEXTA             ,0),
1572           USM(TTM_UPDATETIPTEXTA       ,0),
1573           USM(TTM_GETTOOLCOUNT         ,0),
1574           USM(TTM_ENUMTOOLSA           ,0),
1575           USM(TTM_GETCURRENTTOOLA      ,0),
1576           USM(TTM_WINDOWFROMPOINT      ,0),
1577           USM(TTM_TRACKACTIVATE        ,0),
1578           USM(TTM_TRACKPOSITION        ,0),
1579           USM(TTM_SETTIPBKCOLOR        ,0),
1580           USM(TTM_SETTIPTEXTCOLOR      ,0),
1581           USM(TTM_GETDELAYTIME         ,0),
1582           USM(TTM_GETTIPBKCOLOR        ,0),
1583           USM(TTM_GETTIPTEXTCOLOR      ,0),
1584           USM(TTM_SETMAXTIPWIDTH       ,0),
1585           USM(TTM_GETMAXTIPWIDTH       ,0),
1586           USM(TTM_SETMARGIN            ,0),
1587           USM(TTM_GETMARGIN            ,0),
1588           USM(TTM_POP                  ,0),
1589           USM(TTM_UPDATE               ,0),
1590           USM(TTM_GETBUBBLESIZE        ,0),
1591           USM(TTM_ADDTOOLW             ,0),
1592           USM(TTM_DELTOOLW             ,0),
1593           USM(TTM_NEWTOOLRECTW         ,0),
1594           USM(TTM_GETTOOLINFOW         ,0),
1595           USM(TTM_SETTOOLINFOW         ,0),
1596           USM(TTM_HITTESTW             ,0),
1597           USM(TTM_GETTEXTW             ,0),
1598           USM(TTM_UPDATETIPTEXTW       ,0),
1599           USM(TTM_ENUMTOOLSW           ,0),
1600           USM(TTM_GETCURRENTTOOLW      ,0),
1601           {0,0,0} };
1602
1603 static const USER_MSG comboex_array[] = {
1604           USM(CBEM_INSERTITEMA        ,0),
1605           USM(CBEM_SETIMAGELIST       ,0),
1606           USM(CBEM_GETIMAGELIST       ,0),
1607           USM(CBEM_GETITEMA           ,0),
1608           USM(CBEM_SETITEMA           ,0),
1609           USM(CBEM_GETCOMBOCONTROL    ,0),
1610           USM(CBEM_GETEDITCONTROL     ,0),
1611           USM(CBEM_SETEXSTYLE         ,0),
1612           USM(CBEM_GETEXTENDEDSTYLE   ,0),
1613           USM(CBEM_HASEDITCHANGED     ,0),
1614           USM(CBEM_INSERTITEMW        ,0),
1615           USM(CBEM_SETITEMW           ,0),
1616           USM(CBEM_GETITEMW           ,0),
1617           USM(CBEM_SETEXTENDEDSTYLE   ,0),
1618           {0,0,0} };
1619
1620 static const USER_MSG propsht_array[] = {
1621           USM(PSM_SETCURSEL           ,0),
1622           USM(PSM_REMOVEPAGE          ,0),
1623           USM(PSM_ADDPAGE             ,0),
1624           USM(PSM_CHANGED             ,0),
1625           USM(PSM_RESTARTWINDOWS      ,0),
1626           USM(PSM_REBOOTSYSTEM        ,0),
1627           USM(PSM_CANCELTOCLOSE       ,0),
1628           USM(PSM_QUERYSIBLINGS       ,0),
1629           USM(PSM_UNCHANGED           ,0),
1630           USM(PSM_APPLY               ,0),
1631           USM(PSM_SETTITLEA           ,0),
1632           USM(PSM_SETWIZBUTTONS       ,0),
1633           USM(PSM_PRESSBUTTON         ,0),
1634           USM(PSM_SETCURSELID         ,0),
1635           USM(PSM_SETFINISHTEXTA      ,0),
1636           USM(PSM_GETTABCONTROL       ,0),
1637           USM(PSM_ISDIALOGMESSAGE     ,0),
1638           USM(PSM_GETCURRENTPAGEHWND  ,0),
1639           USM(PSM_SETTITLEW           ,0),
1640           USM(PSM_SETFINISHTEXTW      ,0),
1641           {0,0,0} };
1642 static const WCHAR PropSheetInfoStr[] =
1643     {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
1644
1645 static const USER_MSG updown_array[] = {
1646           USM(UDM_SETRANGE            ,0),
1647           USM(UDM_GETRANGE            ,0),
1648           USM(UDM_SETPOS              ,0),
1649           USM(UDM_GETPOS              ,0),
1650           USM(UDM_SETBUDDY            ,0),
1651           USM(UDM_GETBUDDY            ,0),
1652           USM(UDM_SETACCEL            ,0),
1653           USM(UDM_GETACCEL            ,0),
1654           USM(UDM_SETBASE             ,0),
1655           USM(UDM_GETBASE             ,0),
1656           USM(UDM_SETRANGE32          ,0),
1657           USM(UDM_GETRANGE32          ,0),
1658           USM(UDM_SETPOS32            ,0),
1659           USM(UDM_GETPOS32            ,0),
1660           {0,0,0} };
1661
1662 /* generated from:
1663  * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
1664  */
1665 static const USER_MSG richedit_array[] = {
1666           {"EM_SCROLLCARET", WM_USER+49 ,0},
1667           USM(EM_CANPASTE               ,0),
1668           USM(EM_DISPLAYBAND            ,0),
1669           USM(EM_EXGETSEL               ,0),
1670           USM(EM_EXLIMITTEXT            ,0),
1671           USM(EM_EXLINEFROMCHAR         ,0),
1672           USM(EM_EXSETSEL               ,0),
1673           USM(EM_FINDTEXT               ,0),
1674           USM(EM_FORMATRANGE            ,0),
1675           USM(EM_GETCHARFORMAT          ,0),
1676           USM(EM_GETEVENTMASK           ,0),
1677           USM(EM_GETOLEINTERFACE        ,0),
1678           USM(EM_GETPARAFORMAT          ,0),
1679           USM(EM_GETSELTEXT             ,0),
1680           USM(EM_HIDESELECTION          ,0),
1681           USM(EM_PASTESPECIAL           ,0),
1682           USM(EM_REQUESTRESIZE          ,0),
1683           USM(EM_SELECTIONTYPE          ,0),
1684           USM(EM_SETBKGNDCOLOR          ,0),
1685           USM(EM_SETCHARFORMAT          ,0),
1686           USM(EM_SETEVENTMASK           ,0),
1687           USM(EM_SETOLECALLBACK         ,0),
1688           USM(EM_SETPARAFORMAT          ,0),
1689           USM(EM_SETTARGETDEVICE        ,0),
1690           USM(EM_STREAMIN               ,0),
1691           USM(EM_STREAMOUT              ,0),
1692           USM(EM_GETTEXTRANGE           ,0),
1693           USM(EM_FINDWORDBREAK          ,0),
1694           USM(EM_SETOPTIONS             ,0),
1695           USM(EM_GETOPTIONS             ,0),
1696           USM(EM_FINDTEXTEX             ,0),
1697           USM(EM_GETWORDBREAKPROCEX     ,0),
1698           USM(EM_SETWORDBREAKPROCEX     ,0),
1699           USM(EM_SETUNDOLIMIT           ,0),
1700           USM(EM_REDO                   ,0),
1701           USM(EM_CANREDO                ,0),
1702           USM(EM_GETUNDONAME            ,0),
1703           USM(EM_GETREDONAME            ,0),
1704           USM(EM_STOPGROUPTYPING        ,0),
1705           USM(EM_SETTEXTMODE            ,0),
1706           USM(EM_GETTEXTMODE            ,0),
1707           USM(EM_AUTOURLDETECT          ,0),
1708           USM(EM_GETAUTOURLDETECT       ,0),
1709           USM(EM_SETPALETTE             ,0),
1710           USM(EM_GETTEXTEX              ,0),
1711           USM(EM_GETTEXTLENGTHEX        ,0),
1712           USM(EM_SHOWSCROLLBAR          ,0),
1713           USM(EM_SETTEXTEX              ,0),
1714           USM(EM_SETPUNCTUATION         ,0),
1715           USM(EM_GETPUNCTUATION         ,0),
1716           USM(EM_SETWORDWRAPMODE        ,0),
1717           USM(EM_GETWORDWRAPMODE        ,0),
1718           USM(EM_SETIMECOLOR            ,0),
1719           USM(EM_GETIMECOLOR            ,0),
1720           USM(EM_SETIMEOPTIONS          ,0),
1721           USM(EM_GETIMEOPTIONS          ,0),
1722           USM(EM_CONVPOSITION           ,0),
1723           USM(EM_SETLANGOPTIONS         ,0),
1724           USM(EM_GETLANGOPTIONS         ,0),
1725           USM(EM_GETIMECOMPMODE         ,0),
1726           USM(EM_FINDTEXTW              ,0),
1727           USM(EM_FINDTEXTEXW            ,0),
1728           USM(EM_RECONVERSION           ,0),
1729           USM(EM_SETIMEMODEBIAS         ,0),
1730           USM(EM_GETIMEMODEBIAS         ,0),
1731           USM(EM_SETBIDIOPTIONS         ,0),
1732           USM(EM_GETBIDIOPTIONS         ,0),
1733           USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
1734           USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
1735           USM(EM_SETEDITSTYLE           ,0),
1736           USM(EM_GETEDITSTYLE           ,0),
1737           USM(EM_OUTLINE                ,0),
1738           USM(EM_GETSCROLLPOS           ,0),
1739           USM(EM_SETSCROLLPOS           ,0),
1740           USM(EM_SETFONTSIZE            ,0),
1741           USM(EM_GETZOOM                ,0),
1742           USM(EM_SETZOOM                ,0),
1743           {0,0,0} };
1744
1745 #undef SZOF
1746 #undef USM
1747
1748 static CONTROL_CLASS  cc_array[] = {
1749     {WC_COMBOBOXEXW,    comboex_array,  0},
1750     {WC_PROPSHEETW,     propsht_array,  0},
1751     {REBARCLASSNAMEW,   rebar_array,    0},
1752     {TOOLBARCLASSNAMEW, toolbar_array,  0},
1753     {TOOLTIPS_CLASSW,   tooltips_array, 0},
1754     {UPDOWN_CLASSW,     updown_array,   0},
1755     {RICHEDIT_CLASS20W, richedit_array, 0},
1756     {0, 0, 0} };
1757
1758
1759 /************************************************************************/
1760
1761
1762 /* WM_NOTIFY function codes display */
1763
1764 typedef struct
1765 {
1766     const char *name;     /* name of notify message        */
1767     UINT        value;     /* notify code value             */
1768     UINT        len;       /* length of extra space to dump */
1769 } SPY_NOTIFY;
1770
1771 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1772
1773 /* Array MUST be in descending order by the 'value' field  */
1774 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1775 /*  0xfffffffe is smaller). A binary search is used to     */
1776 /* locate the correct 'value'.                             */
1777 static const SPY_NOTIFY spnfy_array[] = {
1778     /*  common        0U       to  0U-99U  */
1779     SPNFY(NM_OUTOFMEMORY,        NMHDR),
1780     SPNFY(NM_CLICK,              NMHDR),
1781     SPNFY(NM_DBLCLK,             NMHDR),
1782     SPNFY(NM_RETURN,             NMHDR),
1783     SPNFY(NM_RCLICK,             NMHDR),
1784     SPNFY(NM_RDBLCLK,            NMHDR),
1785     SPNFY(NM_SETFOCUS,           NMHDR),
1786     SPNFY(NM_KILLFOCUS,          NMHDR),
1787     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1788     SPNFY(NM_HOVER,              NMHDR),
1789     SPNFY(NM_NCHITTEST,          NMMOUSE),
1790     SPNFY(NM_KEYDOWN,            NMKEY),
1791     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1792     SPNFY(NM_SETCURSOR,          NMMOUSE),
1793     SPNFY(NM_CHAR,               NMCHAR),
1794     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
1795     /* Listview       0U-100U  to  0U-199U  */
1796     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
1797     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
1798     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
1799     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
1800     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
1801     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
1802     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
1803     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
1804     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
1805     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
1806     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
1807     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
1808     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
1809     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
1810     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
1811     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
1812     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
1813     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
1814     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
1815     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
1816     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
1817     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
1818     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
1819     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
1820     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
1821     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
1822     /* PropertySheet  0U-200U  to  0U-299U  */
1823     SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
1824     SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
1825     SPNFY(PSN_APPLY,             PSHNOTIFY),
1826     SPNFY(PSN_RESET,             PSHNOTIFY),
1827     SPNFY(PSN_HELP,              PSHNOTIFY),
1828     SPNFY(PSN_WIZBACK,           PSHNOTIFY),
1829     SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
1830     SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
1831     SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
1832     SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
1833     SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
1834     SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
1835     /* Header         0U-300U  to  0U-399U  */
1836     SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
1837     SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
1838     SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
1839     SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
1840     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
1841     SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
1842     SPNFY(HDN_ENDTRACKA,         NMHEADERA),
1843     SPNFY(HDN_TRACKA,            NMHEADERA),
1844     SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
1845     SPNFY(HDN_BEGINDRAG,         NMHDR),
1846     SPNFY(HDN_ENDDRAG,           NMHDR),
1847     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
1848     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
1849     SPNFY(HDN_ITEMCLICKW,        NMHDR),
1850     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
1851     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
1852     SPNFY(HDN_BEGINTRACKW,       NMHDR),
1853     SPNFY(HDN_ENDTRACKW,         NMHDR),
1854     SPNFY(HDN_TRACKW,            NMHDR),
1855     SPNFY(HDN_GETDISPINFOW,      NMHDR),
1856     /* Treeview       0U-400U  to  0U-499U  */
1857     SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
1858     SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
1859     SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
1860     SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
1861     SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
1862     SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
1863     SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
1864     SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
1865     SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
1866     SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
1867     SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
1868     SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
1869     SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
1870     SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
1871     SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
1872     SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
1873     SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
1874     SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
1875     SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
1876     SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
1877     SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
1878     SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
1879     SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
1880     /* Tooltips       0U-520U  to  0U-549U  */
1881     SPNFY(TTN_GETDISPINFOA,      NMHDR),
1882     SPNFY(TTN_SHOW,              NMHDR),
1883     SPNFY(TTN_POP,               NMHDR),
1884     SPNFY(TTN_GETDISPINFOW,      NMHDR),
1885     /* Tab            0U-550U  to  0U-580U  */
1886     SPNFY(TCN_KEYDOWN,           NMHDR),
1887     SPNFY(TCN_SELCHANGE,         NMHDR),
1888     SPNFY(TCN_SELCHANGING,       NMHDR),
1889     SPNFY(TCN_GETOBJECT,         NMHDR),
1890     /* Common Dialog  0U-601U  to  0U-699U  */
1891     SPNFY(CDN_INITDONE,          OFNOTIFYA),
1892     SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
1893     SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
1894     SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
1895     SPNFY(CDN_HELP,              OFNOTIFYA),
1896     SPNFY(CDN_FILEOK,            OFNOTIFYA),
1897     SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
1898     /* Toolbar        0U-700U  to  0U-720U  */
1899     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1900     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1901     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1902     SPNFY(TBN_BEGINADJUST,       NMHDR),
1903     SPNFY(TBN_ENDADJUST,         NMHDR),
1904     SPNFY(TBN_RESET,             NMHDR),
1905     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1906     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1907     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1908     SPNFY(TBN_CUSTHELP,          NMHDR),
1909     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1910     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1911     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
1912     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1913     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1914     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
1915     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
1916     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1917     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1918     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1919     /* Up/Down        0U-721U  to  0U-740U  */
1920     SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
1921     /* Month Calendar 0U-750U  to  0U-759U  */
1922     /* ******************* WARNING ***************************** */
1923     /* The following appear backwards but needs to be this way.  */
1924     /* The reason is that MS (and us) define the MCNs as         */
1925     /*         MCN_FIRST + n                                     */
1926     /* instead of the way ALL other notifications are            */
1927     /*         TBN_FIRST - n                                     */
1928     /* The only place that this is important is in this list     */
1929     /*                                                           */
1930     /* Also since the same error was made with the DTN_ items,   */
1931     /* they overlay the MCN_ and need to be inserted in the      */
1932     /* other section of the table so that it is in order for     */
1933     /* the binary search.                                        */
1934     /*                                                           */
1935     /* Thank you MS for your obvious quality control!!           */
1936     /* ******************* WARNING ***************************** */
1937     /* Date/Time      0U-760U  to  0U-799U  */
1938     /* SPNFY(MCN_SELECT,            NMHDR), */
1939     /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
1940     /* SPNFY(MCN_SELCHANGE,         NMHDR), */
1941     /* ******************* WARNING ***************************** */
1942     /* The following appear backwards but needs to be this way.  */
1943     /* The reason is that MS (and us) define the MCNs as         */
1944     /*         DTN_FIRST + n                                     */
1945     /* instead of the way ALL other notifications are            */
1946     /*         TBN_FIRST - n                                     */
1947     /* The only place that this is important is in this list     */
1948     /* ******************* WARNING ***************************** */
1949     SPNFY(DTN_FORMATQUERYW,      NMHDR),
1950     SPNFY(DTN_FORMATW,           NMHDR),
1951     SPNFY(DTN_WMKEYDOWNW,        NMHDR),
1952     SPNFY(DTN_USERSTRINGW,       NMHDR),
1953     SPNFY(MCN_SELECT,            NMHDR),
1954     SPNFY(MCN_GETDAYSTATE,       NMHDR),
1955     SPNFY(MCN_SELCHANGE,         NMHDR),
1956     SPNFY(DTN_CLOSEUP,           NMHDR),
1957     SPNFY(DTN_DROPDOWN,          NMHDR),
1958     SPNFY(DTN_FORMATQUERYA,      NMHDR),
1959     SPNFY(DTN_FORMATA,           NMHDR),
1960     SPNFY(DTN_WMKEYDOWNA,        NMHDR),
1961     SPNFY(DTN_USERSTRINGA,       NMHDR),
1962     SPNFY(DTN_DATETIMECHANGE,    NMHDR),
1963     /* ComboBoxEx     0U-800U  to  0U-830U  */
1964     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
1965     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
1966     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
1967     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1968     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
1969     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
1970     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
1971     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
1972     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
1973     /* Rebar          0U-831U  to  0U-859U  */
1974     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1975     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1976     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1977     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1978     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1979     SPNFY(RBN_ENDDRAG,           NMREBAR),
1980     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1981     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1982     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1983     /* IP address     0U-860U  to  0U-879U  */
1984     SPNFY(IPN_FIELDCHANGED,      NMHDR),
1985     /* Status bar     0U-880U  to  0U-899U  */
1986     SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
1987     /* Pager          0U-900U  to  0U-950U  */
1988     SPNFY(PGN_SCROLL,            NMPGSCROLL),
1989     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
1990     {0,0,0}};
1991 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
1992 #undef SPNFY
1993
1994
1995 static unsigned char SPY_Exclude[SPY_MAX_MSGNUM+1];
1996 static unsigned char SPY_ExcludeDWP = 0;
1997
1998 #define SPY_EXCLUDE(msg) \
1999     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
2000
2001
2002 typedef struct
2003 {
2004     UINT       msgnum;           /* message number */
2005     HWND       msg_hwnd;         /* window handle for message          */
2006     WPARAM     wParam;           /* message parameter                  */
2007     LPARAM     lParam;           /* message parameter                  */
2008     INT        data_len;         /* length of data to dump             */
2009     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
2010     WCHAR      wnd_class[60];    /* window class name (full)           */
2011     WCHAR      wnd_name[16];     /* window name for message            */
2012 } SPY_INSTANCE;
2013
2014 static int indent_tls_index;
2015
2016 /***********************************************************************
2017  *           get_indent_level
2018  */
2019 static inline INT_PTR get_indent_level(void)
2020 {
2021     return (INT_PTR)TlsGetValue( indent_tls_index );
2022 }
2023
2024
2025 /***********************************************************************
2026  *           set_indent_level
2027  */
2028 static inline void set_indent_level( INT_PTR level )
2029 {
2030     TlsSetValue( indent_tls_index, (void *)level );
2031 }
2032
2033
2034 /***********************************************************************
2035  *           SPY_GetMsgInternal
2036  */
2037 static const char *SPY_GetMsgInternal( UINT msg )
2038 {
2039     if (msg <= SPY_MAX_MSGNUM)
2040         return MessageTypeNames[msg];
2041
2042     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
2043         return LVMMessageTypeNames[msg-LVM_FIRST];
2044
2045     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
2046         return TVMessageTypeNames[msg-TV_FIRST];
2047
2048     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
2049         return HDMMessageTypeNames[msg-HDM_FIRST];
2050
2051     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
2052         return TCMMessageTypeNames[msg-TCM_FIRST];
2053
2054     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
2055         return PGMMessageTypeNames[msg-PGM_FIRST];
2056
2057     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
2058         return CCMMessageTypeNames[msg-CCM_FIRST];
2059
2060     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
2061         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
2062
2063     return NULL;
2064 }
2065
2066 /***********************************************************************
2067  *           SPY_Bsearch_Msg
2068  */
2069 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
2070 {
2071     INT count;
2072     const USER_MSG *test;
2073
2074     while (last >= first) {
2075         count = 1 + last - first;
2076         if (count < 3) {
2077 #if DEBUG_SPY
2078             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2079                code, first->value, first->name, last->value, last->name, last->len);
2080 #endif
2081             if (first->value == code) return first;
2082             if (last->value == code) return last;
2083             return NULL;
2084         }
2085         count = count / 2;
2086         test = first + count;
2087 #if DEBUG_SPY
2088         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2089            first, last, test, test->value, code, count);
2090 #endif
2091         if (test->value == code) return test;
2092         if (test->value > code)
2093             last = test - 1;
2094         else
2095             first = test + 1;
2096     }
2097     return NULL;
2098 }
2099
2100 /***********************************************************************
2101  *           SPY_GetClassLongOffsetName
2102  *
2103  * Gets the name of a class long offset.
2104  */
2105 const char *SPY_GetClassLongOffsetName( INT offset )
2106 {
2107     INT index;
2108     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
2109         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames)))
2110     {
2111         return ClassLongOffsetNames[index];
2112     }
2113
2114     return "?";
2115 }
2116
2117 /***********************************************************************
2118  *           SPY_GetClassName
2119  *
2120  *  Sets the value of "wnd_class" member of the instance structure.
2121  */
2122 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
2123 {
2124     /* special code to detect a property sheet dialog   */
2125     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2126         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2127         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2128     }
2129     else {
2130         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2131     }
2132 }
2133
2134 /***********************************************************************
2135  *           SPY_GetMsgStuff
2136  *
2137  *  Get message name and other information for dumping
2138  */
2139 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2140 {
2141     const USER_MSG *p;
2142     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2143
2144     sp_e->data_len = 0;
2145     if (!msg_name)
2146     {
2147         INT i = 0;
2148
2149         if (sp_e->msgnum >= 0xc000)
2150         {
2151             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2152             {
2153                 sp_e->msg_name[0] = '\"';
2154                 strcat( sp_e->msg_name, "\"" );
2155                 return;
2156             }
2157         }
2158         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2159
2160 #if DEBUG_SPY
2161         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2162 #endif
2163
2164         while (cc_array[i].classname &&
2165                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2166
2167         if (cc_array[i].classname)
2168         {
2169 #if DEBUG_SPY
2170             TRACE("process class %s, first %p, last %p\n",
2171                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2172                   cc_array[i].lastmsg);
2173 #endif
2174             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
2175                                  sp_e->msgnum);
2176             if (p) {
2177                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2178                 sp_e->data_len = p->len;
2179                 return;
2180             }
2181         }
2182         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2183             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2184         else
2185             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2186     }
2187     else
2188     {
2189         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2190     }
2191 }
2192
2193 /***********************************************************************
2194  *           SPY_GetWndName
2195  *
2196  *  Sets the value of "wnd_name" and "wnd_class" members of the
2197  *  instance structure.
2198  *
2199  */
2200 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2201 {
2202     INT len;
2203
2204     SPY_GetClassName( sp_e );
2205
2206     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2207     if(!len) /* get class name */
2208     {
2209         LPWSTR dst = sp_e->wnd_name;
2210         LPWSTR src = sp_e->wnd_class;
2211         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2212         *dst++ = '{';
2213         while ((n-- > 0) && *src) *dst++ = *src++;
2214         *dst++ = '}';
2215         *dst = 0;
2216     }
2217 }
2218
2219 /***********************************************************************
2220  *           SPY_GetMsgName
2221  *
2222  *  ****  External function  ****
2223  *
2224  *  Get message name
2225  */
2226 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2227 {
2228     SPY_INSTANCE ext_sp_e;
2229     DWORD save_error = GetLastError();
2230
2231     ext_sp_e.msgnum = msg;
2232     ext_sp_e.msg_hwnd   = hWnd;
2233     ext_sp_e.lParam = 0;
2234     ext_sp_e.wParam = 0;
2235     ext_sp_e.wnd_class[0] = 0;
2236     SPY_GetMsgStuff(&ext_sp_e);
2237     SetLastError( save_error );
2238     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2239 }
2240
2241 /***********************************************************************
2242  *           SPY_GetVKeyName
2243  */
2244 const char *SPY_GetVKeyName(WPARAM wParam)
2245 {
2246     const char *vk_key_name;
2247
2248     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2249         vk_key_name = VK_KeyNames[wParam];
2250     else
2251         vk_key_name = "VK_???";
2252
2253     return vk_key_name;
2254 }
2255
2256 /***********************************************************************
2257  *           SPY_Bsearch_Notify
2258  */
2259 static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
2260 {
2261     INT count;
2262     const SPY_NOTIFY *test;
2263
2264     while (last >= first) {
2265         count = 1 + last - first;
2266         if (count < 3) {
2267 #if DEBUG_SPY
2268             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2269                code, first->value, first->name, last->value, last->name, last->len);
2270 #endif
2271             if (first->value == code) return first;
2272             if (last->value == code) return last;
2273             return NULL;
2274         }
2275         count = count / 2;
2276         test = first + count;
2277 #if DEBUG_SPY
2278         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2279            first, last, test, test->value, code, count);
2280 #endif
2281         if (test->value == code) return test;
2282         if (test->value < code)
2283             last = test - 1;
2284         else
2285             first = test + 1;
2286     }
2287     return NULL;
2288 }
2289
2290 /***********************************************************************
2291  *           SPY_DumpMem
2292  */
2293 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2294 {
2295     int i;
2296
2297     for(i=0; i<len-12; i+=16) {
2298         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2299               header, i, *q, *(q+1), *(q+2), *(q+3));
2300         q += 4;
2301     }
2302     switch ((len - i + 3) & (~3)) {
2303     case 16:
2304         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2305               header, i, *q, *(q+1), *(q+2), *(q+3));
2306         break;
2307     case 12:
2308         TRACE("%s [%04x] %08x %08x %08x\n",
2309               header, i, *q, *(q+1), *(q+2));
2310         break;
2311     case 8:
2312         TRACE("%s [%04x] %08x %08x\n",
2313               header, i, *q, *(q+1));
2314         break;
2315     case 4:
2316         TRACE("%s [%04x] %08x\n",
2317               header, i, *q);
2318         break;
2319     default:
2320         break;
2321     }
2322 }
2323
2324 /***********************************************************************
2325  *           SPY_DumpStructure
2326  */
2327 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2328 {
2329     switch (sp_e->msgnum)
2330         {
2331         case LVM_INSERTITEMW:
2332         case LVM_SETITEMW:
2333             if (!enter) break;
2334             /* fall through */
2335         case LVM_GETITEMW:
2336             {
2337                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2338                 if (item) {
2339                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2340                 }
2341                 break;
2342             }
2343         case TCM_INSERTITEMW:
2344         case TCM_INSERTITEMA:
2345         case TCM_SETITEMW:
2346         case TCM_SETITEMA:
2347             if (!enter) break;
2348             /* fall through */
2349         case TCM_GETITEMW:
2350         case TCM_GETITEMA:
2351             {
2352                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2353                 if (item) {
2354                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2355                 }
2356                 break;
2357             }
2358         case TCM_ADJUSTRECT:
2359         case LVM_GETITEMRECT:
2360         case LVM_GETSUBITEMRECT:
2361             {
2362                 LPRECT rc = (LPRECT) sp_e->lParam;
2363                 if (rc)
2364                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2365                 break;
2366             }
2367         case LVM_SETITEMPOSITION32:
2368             if (!enter) break;
2369             /* fall through */
2370         case LVM_GETITEMPOSITION:
2371         case LVM_GETORIGIN:
2372             {
2373                 LPPOINT point = (LPPOINT) sp_e->lParam;
2374                 if (point) {
2375                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2376                 }
2377                 break;
2378             }
2379         case SBM_SETRANGE:
2380             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2381             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2382             break;
2383         case SBM_GETRANGE:
2384             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2385                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2386             {
2387                 LPINT ptmin = (LPINT) sp_e->wParam;
2388                 LPINT ptmax = (LPINT) sp_e->lParam;
2389                 if (ptmin && ptmax)
2390                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2391                 else if (ptmin)
2392                     TRACE("min=%d max=n/a\n", *ptmin);
2393                 else if (ptmax)
2394                     TRACE("min=n/a max=%d\n", *ptmax);
2395                 break;
2396             }
2397         case EM_EXSETSEL:
2398             if (enter && sp_e->lParam)
2399             {
2400                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2401                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2402             }
2403             break;
2404         case EM_SETCHARFORMAT:
2405             if (enter && sp_e->lParam)
2406             {
2407                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2408                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2409                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2410                     TRACE(" CFE_BOLD");
2411                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2412                     TRACE(" CFE_AUTOCOLOR");
2413                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2414                     TRACE(" CFE_ITALIC");
2415                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2416                     TRACE(" CFE_PROTECTED");
2417                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2418                     TRACE(" CFE_STRIKEOUT");
2419                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2420                     TRACE(" CFE_UNDERLINE");
2421                 TRACE("\n");
2422                 if (cf->dwMask & CFM_SIZE)
2423                     TRACE("yHeight=%d\n", cf->yHeight);
2424                 if (cf->dwMask & CFM_OFFSET)
2425                     TRACE("yOffset=%d\n", cf->yOffset);
2426                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2427                     TRACE("crTextColor=%x\n", cf->crTextColor);
2428                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2429                 /* FIXME: we should try to be a bit more intelligent about
2430                  * whether this is in ANSI or Unicode (it could be either) */
2431                 if (cf->dwMask & CFM_FACE)
2432                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2433                 /* FIXME: handle CHARFORMAT2 too */
2434             }
2435             break;
2436         case WM_DRAWITEM:
2437             if (!enter) break;
2438             {
2439                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2440                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2441                       lpdis->CtlType, lpdis->CtlID);
2442                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2443                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2444                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2445                       lpdis->hwndItem, lpdis->hDC,
2446                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2447             }
2448             break;
2449         case WM_MEASUREITEM:
2450             {
2451                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2452                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2453                       lpmis->CtlType, lpmis->CtlID);
2454                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2455                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2456                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2457             }
2458             break;
2459         case WM_NCCREATE:
2460         case WM_CREATE:
2461         {
2462             BOOL unicode;
2463             CREATESTRUCTA *cs;
2464
2465             if (!enter) break;
2466
2467             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2468             cs = (CREATESTRUCTA *)sp_e->lParam;
2469             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2470                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2471                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2472                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2473                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2474             break;
2475         }
2476         case WM_SIZE:
2477             if (!enter) break;
2478             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2479             break;
2480         case WM_WINDOWPOSCHANGED:
2481             if (!enter) break;
2482         case WM_WINDOWPOSCHANGING:
2483             {
2484                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2485                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2486                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2487                       lpwp->cx, lpwp->cy, lpwp->flags);
2488             }
2489             break;
2490         case WM_STYLECHANGED:
2491             if (!enter) break;
2492         case WM_STYLECHANGING:
2493             {
2494                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2495                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2496                       ss->styleOld, ss->styleNew);
2497             }
2498             break;
2499         case WM_NCCALCSIZE:
2500             {
2501                 RECT *rc = (RECT *)sp_e->lParam;
2502                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2503             }
2504             break;
2505         case WM_NOTIFY:
2506             /* if (!enter) break; */
2507             {
2508                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2509                 UINT *q, dumplen;
2510                 const SPY_NOTIFY *p;
2511                 WCHAR from_class[60];
2512                 DWORD save_error;
2513
2514                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
2515                                         pnmh->code);
2516                 if (p) {
2517                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2518                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2519                     dumplen = p->len;
2520
2521                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2522                     if (pnmh->code == NM_CUSTOMDRAW) {
2523                         /* save and restore error code over the next call */
2524                         save_error = GetLastError();
2525                         GetClassNameW(pnmh->hwndFrom, from_class,
2526                                       sizeof(from_class)/sizeof(WCHAR));
2527                         SetLastError(save_error);
2528                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2529                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2530                     } else if ( pnmh->code >= HDN_ENDDRAG
2531                                 && pnmh->code <= HDN_ITEMCHANGINGA ) {
2532                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2533                     }
2534                     if (dumplen > 0) {
2535                         q = (UINT *)(pnmh + 1);
2536                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2537                     }
2538                 }
2539                 else
2540                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2541                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2542             }
2543         default:
2544             if (sp_e->data_len > 0)
2545                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2546             break;
2547         }
2548
2549 }
2550 /***********************************************************************
2551  *           SPY_EnterMessage
2552  */
2553 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2554                        WPARAM wParam, LPARAM lParam )
2555 {
2556     SPY_INSTANCE sp_e;
2557     int indent;
2558     DWORD save_error = GetLastError();
2559
2560     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
2561
2562     sp_e.msgnum = msg;
2563     sp_e.msg_hwnd = hWnd;
2564     sp_e.lParam = lParam;
2565     sp_e.wParam = wParam;
2566     SPY_GetWndName(&sp_e);
2567     SPY_GetMsgStuff(&sp_e);
2568     indent = get_indent_level();
2569
2570     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2571     switch(iFlag)
2572     {
2573     case SPY_DISPATCHMESSAGE:
2574         TRACE("%*s(%p) %-16s [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2575                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2576                         sp_e.msg_name, wParam, lParam);
2577         break;
2578
2579     case SPY_SENDMESSAGE:
2580         {
2581             char taskName[20];
2582             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2583
2584             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2585             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2586
2587             TRACE("%*s(%p) %-16s [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2588                   indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2589                   sp_e.msg_name, taskName, wParam, lParam );
2590             SPY_DumpStructure(&sp_e, TRUE);
2591         }
2592         break;
2593
2594     case SPY_DEFWNDPROC:
2595         if( SPY_ExcludeDWP ) return;
2596         TRACE("%*s(%p)  DefWindowProc:[%04x] %s  wp=%08lx lp=%08lx\n",
2597               indent, "", hWnd, msg, sp_e.msg_name, wParam, lParam );
2598         break;
2599     }
2600     set_indent_level( indent + SPY_INDENT_UNIT );
2601     SetLastError( save_error );
2602 }
2603
2604
2605 /***********************************************************************
2606  *           SPY_ExitMessage
2607  */
2608 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2609                        WPARAM wParam, LPARAM lParam )
2610 {
2611     SPY_INSTANCE sp_e;
2612     int indent;
2613     DWORD save_error = GetLastError();
2614
2615     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2616         (SPY_ExcludeDWP && iFlag == SPY_RESULT_DEFWND))
2617         return;
2618
2619     sp_e.msgnum = msg;
2620     sp_e.msg_hwnd   = hWnd;
2621     sp_e.lParam = lParam;
2622     sp_e.wParam = wParam;
2623     SPY_GetWndName(&sp_e);
2624     SPY_GetMsgStuff(&sp_e);
2625
2626     if ((indent = get_indent_level()))
2627     {
2628         indent -= SPY_INDENT_UNIT;
2629         set_indent_level( indent );
2630     }
2631
2632     switch(iFlag)
2633     {
2634     case SPY_RESULT_DEFWND:
2635         TRACE(" %*s(%p)  DefWindowProc: [%04x] %s returned %08lx\n",
2636               indent, "", hWnd, msg, sp_e.msg_name, lReturn );
2637         break;
2638
2639     case SPY_RESULT_OK:
2640         TRACE(" %*s(%p) %-16s [%04x] %s returned %08lx\n",
2641                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2642                         sp_e.msg_name, lReturn );
2643         SPY_DumpStructure(&sp_e, FALSE);
2644         break;
2645     }
2646     SetLastError( save_error );
2647 }
2648
2649
2650 /***********************************************************************
2651  *           SPY_Init
2652  */
2653 int SPY_Init(void)
2654 {
2655     int i;
2656     UINT j;
2657     char buffer[1024];
2658     const SPY_NOTIFY *p;
2659     const USER_MSG *q;
2660     HKEY hkey;
2661
2662     if (!TRACE_ON(message)) return TRUE;
2663
2664     indent_tls_index = TlsAlloc();
2665     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2666     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2667     {
2668         DWORD type, count = sizeof(buffer);
2669
2670         buffer[0] = 0;
2671         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2672             strcmp( buffer, "INCLUDEALL" ))
2673         {
2674             TRACE("Include=%s\n", buffer );
2675             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2676                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2677         }
2678
2679         count = sizeof(buffer);
2680         buffer[0] = 0;
2681         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2682         {
2683             TRACE("Exclude=%s\n", buffer );
2684             if (!strcmp( buffer, "EXCLUDEALL" ))
2685                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2686             else
2687                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2688                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2689         }
2690
2691         SPY_ExcludeDWP = 0;
2692         count = sizeof(buffer);
2693         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2694             SPY_ExcludeDWP = atoi(buffer);
2695
2696         RegCloseKey(hkey);
2697     }
2698
2699     /* find last good entry in spy notify array and save addr for b-search */
2700     p = &spnfy_array[0];
2701     j = 0xffffffff;
2702     while (p->name) {
2703         if (p->value > j) {
2704             ERR("Notify message array out of order\n");
2705             ERR("  between values [%08x] %s and [%08x] %s\n",
2706                 j, (p-1)->name, p->value, p->name);
2707             break;
2708         }
2709         j = p->value;
2710         p++;
2711     }
2712     p--;
2713     end_spnfy_array = p;
2714
2715     /* find last good entry in each common control message array
2716      *  and save addr for b-search.
2717      */
2718     i = 0;
2719     while (cc_array[i].classname) {
2720
2721         j = 0x0400; /* minimum entry in array */
2722         q = cc_array[i].classmsg;
2723         while(q->name) {
2724             if (q->value <= j) {
2725                 ERR("Class message array out of order for class %s\n",
2726                     debugstr_w(cc_array[i].classname));
2727                 ERR("  between values [%04x] %s and [%04x] %s\n",
2728                     j, (q-1)->name, q->value, q->name);
2729                 break;
2730             }
2731             j = q->value;
2732             q++;
2733         }
2734         q--;
2735         cc_array[i].lastmsg = q;
2736
2737         i++;
2738     }
2739
2740     return 1;
2741 }