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