gdiplus: Implement CachedBitmap based on Image.
[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   140
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     NULL,
876     "LVM_SETBKIMAGEW",
877     "LVM_GETBKIMAGEW"   /* 0x108B */
878 };
879
880
881 #define SPY_MAX_TVMSGNUM   65
882 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
883 {
884     "TVM_INSERTITEMA",          /* 1100 */
885     "TVM_DELETEITEM",
886     "TVM_EXPAND",
887     NULL,
888     "TVM_GETITEMRECT",
889     "TVM_GETCOUNT",
890     "TVM_GETINDENT",
891     "TVM_SETINDENT",
892     "TVM_GETIMAGELIST",
893     "TVM_SETIMAGELIST",
894     "TVM_GETNEXTITEM",
895     "TVM_SELECTITEM",
896     "TVM_GETITEMA",
897     "TVM_SETITEMA",
898     "TVM_EDITLABELA",
899     "TVM_GETEDITCONTROL",
900     "TVM_GETVISIBLECOUNT",
901     "TVM_HITTEST",
902     "TVM_CREATEDRAGIMAGE",
903     "TVM_SORTCHILDREN",
904     "TVM_ENSUREVISIBLE",
905     "TVM_SORTCHILDRENCB",
906     "TVM_ENDEDITLABELNOW",
907     "TVM_GETISEARCHSTRINGA",
908     "TVM_SETTOOLTIPS",
909     "TVM_GETTOOLTIPS",
910     "TVM_SETINSERTMARK",
911     "TVM_SETITEMHEIGHT",
912     "TVM_GETITEMHEIGHT",
913     "TVM_SETBKCOLOR",
914     "TVM_SETTEXTCOLOR",
915     "TVM_GETBKCOLOR",
916     "TVM_GETTEXTCOLOR",
917     "TVM_SETSCROLLTIME",
918     "TVM_GETSCROLLTIME",
919     "TVM_UNKNOWN35",
920     "TVM_UNKNOWN36",
921     "TVM_SETINSERTMARKCOLOR",
922     "TVM_GETINSERTMARKCOLOR",
923     "TVM_GETITEMSTATE",
924     "TVM_SETLINECOLOR",
925     "TVM_GETLINECOLOR",
926     NULL,
927     NULL,
928     NULL,
929     NULL,
930     NULL,
931     NULL,
932     NULL,
933     NULL,
934     "TVM_INSERTITEMW",
935     NULL,
936     NULL,
937     NULL,
938     NULL,
939     NULL,
940     NULL,
941     NULL,
942     NULL,
943     NULL,
944     NULL,
945     NULL,
946     "TVM_GETITEMW",
947     "TVM_SETITEMW",
948     "TVM_GETISEARCHSTRINGW",
949     "TVM_EDITLABELW"
950 };
951
952
953 #define SPY_MAX_HDMMSGNUM   19
954 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
955 {
956     "HDM_GETITEMCOUNT",         /* 1200 */
957     "HDM_INSERTITEMA",
958     "HDM_DELETEITEM",
959     "HDM_GETITEMA",
960     "HDM_SETITEMA",
961     "HDM_LAYOUT",
962     "HDM_HITTEST",
963     "HDM_GETITEMRECT",
964     "HDM_SETIMAGELIST",
965     "HDM_GETIMAGELIST",
966     "HDM_INSERTITEMW",
967     "HDM_GETITEMW",
968     "HDM_SETITEMW",
969     NULL,
970     NULL,
971     "HDM_ORDERTOINDEX",
972     "HDM_CREATEDRAGIMAGE",
973     "GETORDERARRAYINDEX",
974     "SETORDERARRAYINDEX",
975     "SETHOTDIVIDER"
976 };
977
978
979 #define SPY_MAX_TCMMSGNUM   62
980 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
981 {
982     NULL,               /* 1300 */
983     NULL,
984     "TCM_SETIMAGELIST",
985     "TCM_GETIMAGELIST",
986     "TCM_GETITEMCOUNT",
987     "TCM_GETITEMA",
988     "TCM_SETITEMA",
989     "TCM_INSERTITEMA",
990     "TCM_DELETEITEM",
991     "TCM_DELETEALLITEMS",
992     "TCM_GETITEMRECT",
993     "TCM_GETCURSEL",
994     "TCM_SETCURSEL",
995     "TCM_HITTEST",
996     "TCM_SETITEMEXTRA",
997     NULL,
998     NULL,
999     NULL,
1000     NULL,
1001     NULL,
1002     NULL,
1003     NULL,
1004     NULL,
1005     NULL,
1006     NULL,
1007     NULL,
1008     NULL,
1009     NULL,
1010     NULL,
1011     NULL,
1012     NULL,
1013     NULL,
1014     NULL,
1015     NULL,
1016     NULL,
1017     NULL,
1018     NULL,
1019     NULL,
1020     NULL,
1021     NULL,
1022     "TCM_ADJUSTRECT",
1023     "TCM_SETITEMSIZE",
1024     "TCM_REMOVEIMAGE",
1025     "TCM_SETPADDING",
1026     "TCM_GETROWCOUNT",
1027     "TCM_GETTOOLTIPS",
1028     "TCM_SETTOOLTIPS",
1029     "TCM_GETCURFOCUS",
1030     "TCM_SETCURFOCUS",
1031     "TCM_SETMINTABWIDTH",
1032     "TCM_DESELECTALL",
1033     "TCM_HIGHLIGHTITEM",
1034     "TCM_SETEXTENDEDSTYLE",
1035     "TCM_GETEXTENDEDSTYLE",
1036     NULL,
1037     NULL,
1038     NULL,
1039     NULL,
1040     NULL,
1041     NULL,
1042     "TCM_GETITEMW",
1043     "TCM_SETITEMW",
1044     "TCM_INSERTITEMW"
1045 };
1046
1047 #define SPY_MAX_PGMMSGNUM   13
1048 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
1049 {
1050     NULL,               /* 1400 */
1051     "PGM_SETCHILD",
1052     "PGM_RECALCSIZE",
1053     "PGM_FORWARDMOUSE",
1054     "PGM_SETBKCOLOR",
1055     "PGM_GETBKCOLOR",
1056     "PGM_SETBORDER",
1057     "PGM_GETBORDER",
1058     "PGM_SETPOS",
1059     "PGM_GETPOS",
1060     "PGM_SETBUTTONSIZE",
1061     "PGM_GETBUTTONSIZE",
1062     "PGM_GETBUTTONSTATE",
1063     "PGM_GETDROPTARGET"
1064 };
1065
1066
1067 #define SPY_MAX_CCMMSGNUM   9
1068 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
1069 {
1070     NULL,               /* 0x2000 */
1071     "CCM_SETBKCOLOR",
1072     "CCM_SETCOLORSCHEME",
1073     "CCM_GETCOLORSCHEME",
1074     "CCM_GETDROPTARGET",
1075     "CCM_SETUNICODEFORMAT",
1076     "CCM_GETUNICODEFORMAT",
1077     "CCM_SETVERSION",
1078     "CCM_GETVERSION",
1079     "CCM_SETNOTIFYWINDOW"
1080 };
1081
1082 #define SPY_MAX_WINEMSGNUM   (WM_WINE_MOUSE_LL_HOOK - WM_WINE_DESTROYWINDOW)
1083 static const char * const WINEMessageTypeNames[SPY_MAX_WINEMSGNUM + 1] =
1084 {
1085     "WM_WINE_DESTROYWINDOW",
1086     "WM_WINE_SETWINDOWPOS",
1087     "WM_WINE_SHOWWINDOW",
1088     "WM_WINE_SETPARENT",
1089     "WM_WINE_SETWINDOWLONG",
1090     "WM_WINE_ENABLEWINDOW",
1091     "WM_WINE_SETACTIVEWINDOW",
1092     "WM_WINE_KEYBOARD_LL_HOOK",
1093     "WM_WINE_MOUSE_LL_HOOK",
1094 };
1095
1096 /* Virtual key names */
1097 #define SPY_MAX_VKKEYSNUM 255
1098 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
1099 {
1100     NULL,               /* 0x00 */
1101     "VK_LBUTTON",       /* 0x01 */
1102     "VK_RBUTTON",       /* 0x02 */
1103     "VK_CANCEL",        /* 0x03 */
1104     "VK_MBUTTON",       /* 0x04 */
1105     "VK_XBUTTON1",      /* 0x05 */
1106     "VK_XBUTTON2",      /* 0x06 */
1107     NULL,               /* 0x07 */
1108     "VK_BACK",          /* 0x08 */
1109     "VK_TAB",           /* 0x09 */
1110     NULL,               /* 0x0A */
1111     NULL,               /* 0x0B */
1112     "VK_CLEAR",         /* 0x0C */
1113     "VK_RETURN",        /* 0x0D */
1114     NULL,               /* 0x0E */
1115     NULL,               /* 0x0F */
1116     "VK_SHIFT",         /* 0x10 */
1117     "VK_CONTROL",       /* 0x11 */
1118     "VK_MENU",          /* 0x12 */
1119     "VK_PAUSE",         /* 0x13 */
1120     "VK_CAPITAL",       /* 0x14 */
1121     NULL,               /* 0x15 */
1122     NULL,               /* 0x16 */
1123     NULL,               /* 0x17 */
1124     NULL,               /* 0x18 */
1125     NULL,               /* 0x19 */
1126     NULL,               /* 0x1A */
1127     "VK_ESCAPE",        /* 0x1B */
1128     NULL,               /* 0x1C */
1129     NULL,               /* 0x1D */
1130     NULL,               /* 0x1E */
1131     NULL,               /* 0x1F */
1132     "VK_SPACE",         /* 0x20 */
1133     "VK_PRIOR",         /* 0x21 */
1134     "VK_NEXT",          /* 0x22 */
1135     "VK_END",           /* 0x23 */
1136     "VK_HOME",          /* 0x24 */
1137     "VK_LEFT",          /* 0x25 */
1138     "VK_UP",            /* 0x26 */
1139     "VK_RIGHT",         /* 0x27 */
1140     "VK_DOWN",          /* 0x28 */
1141     "VK_SELECT",        /* 0x29 */
1142     "VK_PRINT",         /* 0x2A */
1143     "VK_EXECUTE",       /* 0x2B */
1144     "VK_SNAPSHOT",      /* 0x2C */
1145     "VK_INSERT",        /* 0x2D */
1146     "VK_DELETE",        /* 0x2E */
1147     "VK_HELP",          /* 0x2F */
1148     "VK_0",             /* 0x30 */
1149     "VK_1",             /* 0x31 */
1150     "VK_2",             /* 0x32 */
1151     "VK_3",             /* 0x33 */
1152     "VK_4",             /* 0x34 */
1153     "VK_5",             /* 0x35 */
1154     "VK_6",             /* 0x36 */
1155     "VK_7",             /* 0x37 */
1156     "VK_8",             /* 0x38 */
1157     "VK_9",             /* 0x39 */
1158     NULL,               /* 0x3A */
1159     NULL,               /* 0x3B */
1160     NULL,               /* 0x3C */
1161     NULL,               /* 0x3D */
1162     NULL,               /* 0x3E */
1163     NULL,               /* 0x3F */
1164     NULL,               /* 0x40 */
1165     "VK_A",             /* 0x41 */
1166     "VK_B",             /* 0x42 */
1167     "VK_C",             /* 0x43 */
1168     "VK_D",             /* 0x44 */
1169     "VK_E",             /* 0x45 */
1170     "VK_F",             /* 0x46 */
1171     "VK_G",             /* 0x47 */
1172     "VK_H",             /* 0x48 */
1173     "VK_I",             /* 0x49 */
1174     "VK_J",             /* 0x4A */
1175     "VK_K",             /* 0x4B */
1176     "VK_L",             /* 0x4C */
1177     "VK_M",             /* 0x4D */
1178     "VK_N",             /* 0x4E */
1179     "VK_O",             /* 0x4F */
1180     "VK_P",             /* 0x50 */
1181     "VK_Q",             /* 0x51 */
1182     "VK_R",             /* 0x52 */
1183     "VK_S",             /* 0x53 */
1184     "VK_T",             /* 0x54 */
1185     "VK_U",             /* 0x55 */
1186     "VK_V",             /* 0x56 */
1187     "VK_W",             /* 0x57 */
1188     "VK_X",             /* 0x58 */
1189     "VK_Y",             /* 0x59 */
1190     "VK_Z",             /* 0x5A */
1191     "VK_LWIN",          /* 0x5B */
1192     "VK_RWIN",          /* 0x5C */
1193     "VK_APPS",          /* 0x5D */
1194     NULL,               /* 0x5E */
1195     NULL,               /* 0x5F */
1196     "VK_NUMPAD0",       /* 0x60 */
1197     "VK_NUMPAD1",       /* 0x61 */
1198     "VK_NUMPAD2",       /* 0x62 */
1199     "VK_NUMPAD3",       /* 0x63 */
1200     "VK_NUMPAD4",       /* 0x64 */
1201     "VK_NUMPAD5",       /* 0x65 */
1202     "VK_NUMPAD6",       /* 0x66 */
1203     "VK_NUMPAD7",       /* 0x67 */
1204     "VK_NUMPAD8",       /* 0x68 */
1205     "VK_NUMPAD9",       /* 0x69 */
1206     "VK_MULTIPLY",      /* 0x6A */
1207     "VK_ADD",           /* 0x6B */
1208     "VK_SEPARATOR",     /* 0x6C */
1209     "VK_SUBTRACT",      /* 0x6D */
1210     "VK_DECIMAL",       /* 0x6E */
1211     "VK_DIVIDE",        /* 0x6F */
1212     "VK_F1",            /* 0x70 */
1213     "VK_F2",            /* 0x71 */
1214     "VK_F3",            /* 0x72 */
1215     "VK_F4",            /* 0x73 */
1216     "VK_F5",            /* 0x74 */
1217     "VK_F6",            /* 0x75 */
1218     "VK_F7",            /* 0x76 */
1219     "VK_F8",            /* 0x77 */
1220     "VK_F9",            /* 0x78 */
1221     "VK_F10",           /* 0x79 */
1222     "VK_F11",           /* 0x7A */
1223     "VK_F12",           /* 0x7B */
1224     "VK_F13",           /* 0x7C */
1225     "VK_F14",           /* 0x7D */
1226     "VK_F15",           /* 0x7E */
1227     "VK_F16",           /* 0x7F */
1228     "VK_F17",           /* 0x80 */
1229     "VK_F18",           /* 0x81 */
1230     "VK_F19",           /* 0x82 */
1231     "VK_F20",           /* 0x83 */
1232     "VK_F21",           /* 0x84 */
1233     "VK_F22",           /* 0x85 */
1234     "VK_F23",           /* 0x86 */
1235     "VK_F24",           /* 0x87 */
1236     NULL,               /* 0x88 */
1237     NULL,               /* 0x89 */
1238     NULL,               /* 0x8A */
1239     NULL,               /* 0x8B */
1240     NULL,               /* 0x8C */
1241     NULL,               /* 0x8D */
1242     NULL,               /* 0x8E */
1243     NULL,               /* 0x8F */
1244     "VK_NUMLOCK",       /* 0x90 */
1245     "VK_SCROLL",        /* 0x91 */
1246     NULL,               /* 0x92 */
1247     NULL,               /* 0x93 */
1248     NULL,               /* 0x94 */
1249     NULL,               /* 0x95 */
1250     NULL,               /* 0x96 */
1251     NULL,               /* 0x97 */
1252     NULL,               /* 0x98 */
1253     NULL,               /* 0x99 */
1254     NULL,               /* 0x9A */
1255     NULL,               /* 0x9B */
1256     NULL,               /* 0x9C */
1257     NULL,               /* 0x9D */
1258     NULL,               /* 0x9E */
1259     NULL,               /* 0x9F */
1260     "VK_LSHIFT",        /* 0xA0 */
1261     "VK_RSHIFT",        /* 0xA1 */
1262     "VK_LCONTROL",      /* 0xA2 */
1263     "VK_RCONTROL",      /* 0xA3 */
1264     "VK_LMENU",         /* 0xA4 */
1265     "VK_RMENU",         /* 0xA5 */
1266     "VK_BROWSER_BACK",        /* 0xA6 */
1267     "VK_BROWSER_FORWARD",     /* 0xA7 */
1268     "VK_BROWSER_REFRESH",     /* 0xA8 */
1269     "VK_BROWSER_STOP",        /* 0xA9 */
1270     "VK_BROWSER_SEARCH",      /* 0xAA */
1271     "VK_BROWSER_FAVORITES",   /* 0xAB */
1272     "VK_BROWSER_HOME",        /* 0xAC */
1273     "VK_VOLUME_MUTE",         /* 0xAD */
1274     "VK_VOLUME_DOWN",         /* 0xAE */
1275     "VK_VOLUME_UP",           /* 0xAF */
1276     "VK_MEDIA_NEXT_TRACK",    /* 0xB0 */
1277     "VK_MEDIA_PREV_TRACK",    /* 0xB1 */
1278     "VK_MEDIA_STOP",          /* 0xB2 */
1279     "VK_MEDIA_PLAY_PAUSE",    /* 0xB3 */
1280     "VK_LAUNCH_MAIL",         /* 0xB4 */
1281     "VK_LAUNCH_MEDIA_SELECT", /* 0xB5 */
1282     "VK_LAUNCH_APP1",         /* 0xB6 */
1283     "VK_LAUNCH_APP2",         /* 0xB7 */
1284     NULL,               /* 0xB8 */
1285     NULL,               /* 0xB9 */
1286     "VK_OEM_1",         /* 0xBA */
1287     "VK_OEM_PLUS",      /* 0xBB */
1288     "VK_OEM_COMMA",     /* 0xBC */
1289     "VK_OEM_MINUS",     /* 0xBD */
1290     "VK_OEM_PERIOD",    /* 0xBE */
1291     "VK_OEM_2",         /* 0xBF */
1292     "VK_OEM_3",         /* 0xC0 */
1293     NULL,               /* 0xC1 */
1294     NULL,               /* 0xC2 */
1295     NULL,               /* 0xC3 */
1296     NULL,               /* 0xC4 */
1297     NULL,               /* 0xC5 */
1298     NULL,               /* 0xC6 */
1299     NULL,               /* 0xC7 */
1300     NULL,               /* 0xC8 */
1301     NULL,               /* 0xC9 */
1302     NULL,               /* 0xCA */
1303     NULL,               /* 0xCB */
1304     NULL,               /* 0xCC */
1305     NULL,               /* 0xCD */
1306     NULL,               /* 0xCE */
1307     NULL,               /* 0xCF */
1308     NULL,               /* 0xD0 */
1309     NULL,               /* 0xD1 */
1310     NULL,               /* 0xD2 */
1311     NULL,               /* 0xD3 */
1312     NULL,               /* 0xD4 */
1313     NULL,               /* 0xD5 */
1314     NULL,               /* 0xD6 */
1315     NULL,               /* 0xD7 */
1316     NULL,               /* 0xD8 */
1317     NULL,               /* 0xD9 */
1318     NULL,               /* 0xDA */
1319     "VK_OEM_4",         /* 0xDB */
1320     "VK_OEM_5",         /* 0xDC */
1321     "VK_OEM_6",         /* 0xDD */
1322     "VK_OEM_7",         /* 0xDE */
1323     "VK_OEM_8",         /* 0xDF */
1324     NULL,               /* 0xE0 */
1325     "VK_OEM_AX",        /* 0xE1 */
1326     "VK_OEM_102",       /* 0xE2 */
1327     "VK_ICO_HELP",      /* 0xE3 */
1328     "VK_ICO_00",        /* 0xE4 */
1329     "VK_PROCESSKEY",    /* 0xE5 */
1330     NULL,               /* 0xE6 */
1331     NULL,               /* 0xE7 */
1332     NULL,               /* 0xE8 */
1333     NULL,               /* 0xE9 */
1334     NULL,               /* 0xEA */
1335     NULL,               /* 0xEB */
1336     NULL,               /* 0xEC */
1337     NULL,               /* 0xED */
1338     NULL,               /* 0xEE */
1339     NULL,               /* 0xEF */
1340     NULL,               /* 0xF0 */
1341     NULL,               /* 0xF1 */
1342     NULL,               /* 0xF2 */
1343     NULL,               /* 0xF3 */
1344     NULL,               /* 0xF4 */
1345     NULL,               /* 0xF5 */
1346     "VK_ATTN",          /* 0xF6 */
1347     "VK_CRSEL",         /* 0xF7 */
1348     "VK_EXSEL",         /* 0xF8 */
1349     "VK_EREOF",         /* 0xF9 */
1350     "VK_PLAY",          /* 0xFA */
1351     "VK_ZOOM",          /* 0xFB */
1352     "VK_NONAME",        /* 0xFC */
1353     "VK_PA1",           /* 0xFD */
1354     "VK_OEM_CLEAR",     /* 0xFE */
1355     NULL                /* 0xFF */
1356 };
1357
1358
1359 /************************************************************************/
1360
1361
1362 /* WM_USER+n message values for "common controls" */
1363
1364 typedef struct
1365 {
1366     const char *name;      /* name of control message           */
1367     UINT        value;     /* message number (0x0401-0x0fff     */
1368     UINT        len;       /* length of space at lParam to dump */
1369 } USER_MSG;
1370
1371
1372 typedef struct
1373 {
1374 const WCHAR      *classname;  /* class name to match                  */
1375 const USER_MSG   *classmsg;   /* pointer to first USER_MSG for class  */
1376 const USER_MSG   *lastmsg;    /* pointer to last USER_MSG for class   */
1377 } CONTROL_CLASS;
1378
1379 #define USM(a,b) { #a ,a,b}
1380 #define SZOF(a)  sizeof(a)
1381
1382 /* To dump memory at the lParam for any of these messages,  */
1383 /* replace the "0" with a "SZOF(structure)", or with a      */
1384 /* number. (First method preferred.)                         */
1385
1386 #define RB_GETBANDINFO_OLD (WM_USER+5) /* obsoleted after IE3, but we have to support it anyway */
1387
1388 static const USER_MSG rebar_array[] = {
1389           USM(RB_INSERTBANDA,          0),
1390           USM(RB_DELETEBAND,           0),
1391           USM(RB_GETBARINFO,           0),
1392           USM(RB_SETBARINFO,           0),
1393           USM(RB_GETBANDINFO_OLD,      0),
1394           USM(RB_SETBANDINFOA,         0),
1395           USM(RB_SETPARENT,            0),
1396           USM(RB_HITTEST,              0),
1397           USM(RB_GETRECT,              0),
1398           USM(RB_INSERTBANDW,          0),
1399           USM(RB_SETBANDINFOW,         0),
1400           USM(RB_GETBANDCOUNT,         0),
1401           USM(RB_GETROWCOUNT,          0),
1402           USM(RB_GETROWHEIGHT,         0),
1403           USM(RB_IDTOINDEX,            0),
1404           USM(RB_GETTOOLTIPS,          0),
1405           USM(RB_SETTOOLTIPS,          0),
1406           USM(RB_SETBKCOLOR,           0),
1407           USM(RB_GETBKCOLOR,           0),
1408           USM(RB_SETTEXTCOLOR,         0),
1409           USM(RB_GETTEXTCOLOR,         0),
1410           USM(RB_SIZETORECT,           0),
1411           USM(RB_BEGINDRAG,            0),
1412           USM(RB_ENDDRAG,              0),
1413           USM(RB_DRAGMOVE,             0),
1414           USM(RB_GETBARHEIGHT,         0),
1415           USM(RB_GETBANDINFOW,         0),
1416           USM(RB_GETBANDINFOA,         0),
1417           USM(RB_MINIMIZEBAND,         0),
1418           USM(RB_MAXIMIZEBAND,         0),
1419           USM(RB_GETBANDBORDERS,       0),
1420           USM(RB_SHOWBAND,             0),
1421           USM(RB_SETPALETTE,           0),
1422           USM(RB_GETPALETTE,           0),
1423           USM(RB_MOVEBAND,             0),
1424           {0,0,0} };
1425
1426 static const USER_MSG toolbar_array[] = {
1427           USM(TB_ENABLEBUTTON          ,0),
1428           USM(TB_CHECKBUTTON           ,0),
1429           USM(TB_PRESSBUTTON           ,0),
1430           USM(TB_HIDEBUTTON            ,0),
1431           USM(TB_INDETERMINATE         ,0),
1432           USM(TB_MARKBUTTON            ,0),
1433           USM(TB_ISBUTTONENABLED       ,0),
1434           USM(TB_ISBUTTONCHECKED       ,0),
1435           USM(TB_ISBUTTONPRESSED       ,0),
1436           USM(TB_ISBUTTONHIDDEN        ,0),
1437           USM(TB_ISBUTTONINDETERMINATE ,0),
1438           USM(TB_ISBUTTONHIGHLIGHTED   ,0),
1439           USM(TB_SETSTATE              ,0),
1440           USM(TB_GETSTATE              ,0),
1441           USM(TB_ADDBITMAP             ,0),
1442           USM(TB_ADDBUTTONSA           ,0),
1443           USM(TB_INSERTBUTTONA         ,0),
1444           USM(TB_DELETEBUTTON          ,0),
1445           USM(TB_GETBUTTON             ,0),
1446           USM(TB_BUTTONCOUNT           ,0),
1447           USM(TB_COMMANDTOINDEX        ,0),
1448           USM(TB_SAVERESTOREA          ,0),
1449           USM(TB_CUSTOMIZE             ,0),
1450           USM(TB_ADDSTRINGA            ,0),
1451           USM(TB_GETITEMRECT           ,0),
1452           USM(TB_BUTTONSTRUCTSIZE      ,0),
1453           USM(TB_SETBUTTONSIZE         ,0),
1454           USM(TB_SETBITMAPSIZE         ,0),
1455           USM(TB_AUTOSIZE              ,0),
1456           USM(TB_GETTOOLTIPS           ,0),
1457           USM(TB_SETTOOLTIPS           ,0),
1458           USM(TB_SETPARENT             ,0),
1459           USM(TB_SETROWS               ,0),
1460           USM(TB_GETROWS               ,0),
1461           USM(TB_GETBITMAPFLAGS        ,0),
1462           USM(TB_SETCMDID              ,0),
1463           USM(TB_CHANGEBITMAP          ,0),
1464           USM(TB_GETBITMAP             ,0),
1465           USM(TB_GETBUTTONTEXTA        ,0),
1466           USM(TB_REPLACEBITMAP         ,0),
1467           USM(TB_SETINDENT             ,0),
1468           USM(TB_SETIMAGELIST          ,0),
1469           USM(TB_GETIMAGELIST          ,0),
1470           USM(TB_LOADIMAGES            ,0),
1471           USM(TB_GETRECT               ,0),
1472           USM(TB_SETHOTIMAGELIST       ,0),
1473           USM(TB_GETHOTIMAGELIST       ,0),
1474           USM(TB_SETDISABLEDIMAGELIST  ,0),
1475           USM(TB_GETDISABLEDIMAGELIST  ,0),
1476           USM(TB_SETSTYLE              ,0),
1477           USM(TB_GETSTYLE              ,0),
1478           USM(TB_GETBUTTONSIZE         ,0),
1479           USM(TB_SETBUTTONWIDTH        ,0),
1480           USM(TB_SETMAXTEXTROWS        ,0),
1481           USM(TB_GETTEXTROWS           ,0),
1482           USM(TB_GETOBJECT             ,0),
1483           USM(TB_GETBUTTONINFOW        ,0),
1484           USM(TB_SETBUTTONINFOW        ,0),
1485           USM(TB_GETBUTTONINFOA        ,0),
1486           USM(TB_SETBUTTONINFOA        ,0),
1487           USM(TB_INSERTBUTTONW         ,0),
1488           USM(TB_ADDBUTTONSW           ,0),
1489           USM(TB_HITTEST               ,0),
1490           USM(TB_SETDRAWTEXTFLAGS      ,0),
1491           USM(TB_GETHOTITEM            ,0),
1492           USM(TB_SETHOTITEM            ,0),
1493           USM(TB_SETANCHORHIGHLIGHT    ,0),
1494           USM(TB_GETANCHORHIGHLIGHT    ,0),
1495           USM(TB_GETBUTTONTEXTW        ,0),
1496           USM(TB_SAVERESTOREW          ,0),
1497           USM(TB_ADDSTRINGW            ,0),
1498           USM(TB_MAPACCELERATORA       ,0),
1499           USM(TB_GETINSERTMARK         ,0),
1500           USM(TB_SETINSERTMARK         ,0),
1501           USM(TB_INSERTMARKHITTEST     ,0),
1502           USM(TB_MOVEBUTTON            ,0),
1503           USM(TB_GETMAXSIZE            ,0),
1504           USM(TB_SETEXTENDEDSTYLE      ,0),
1505           USM(TB_GETEXTENDEDSTYLE      ,0),
1506           USM(TB_GETPADDING            ,0),
1507           USM(TB_SETPADDING            ,0),
1508           USM(TB_SETINSERTMARKCOLOR    ,0),
1509           USM(TB_GETINSERTMARKCOLOR    ,0),
1510           USM(TB_MAPACCELERATORW       ,0),
1511           USM(TB_GETSTRINGW            ,0),
1512           USM(TB_GETSTRINGA            ,0),
1513           USM(TB_UNKWN45D              ,8),
1514           USM(TB_UNKWN45E              ,0),
1515           USM(TB_UNKWN460              ,0),
1516           USM(TB_UNKWN463              ,8),
1517           USM(TB_UNKWN464              ,0),
1518           {0,0,0} };
1519
1520 static const USER_MSG tooltips_array[] = {
1521           USM(TTM_ACTIVATE             ,0),
1522           USM(TTM_SETDELAYTIME         ,0),
1523           USM(TTM_ADDTOOLA             ,0),
1524           USM(TTM_DELTOOLA             ,0),
1525           USM(TTM_NEWTOOLRECTA         ,0),
1526           USM(TTM_RELAYEVENT           ,0),
1527           USM(TTM_GETTOOLINFOA         ,0),
1528           USM(TTM_HITTESTA             ,0),
1529           USM(TTM_GETTEXTA             ,0),
1530           USM(TTM_UPDATETIPTEXTA       ,0),
1531           USM(TTM_GETTOOLCOUNT         ,0),
1532           USM(TTM_ENUMTOOLSA           ,0),
1533           USM(TTM_GETCURRENTTOOLA      ,0),
1534           USM(TTM_WINDOWFROMPOINT      ,0),
1535           USM(TTM_TRACKACTIVATE        ,0),
1536           USM(TTM_TRACKPOSITION        ,0),
1537           USM(TTM_SETTIPBKCOLOR        ,0),
1538           USM(TTM_SETTIPTEXTCOLOR      ,0),
1539           USM(TTM_GETDELAYTIME         ,0),
1540           USM(TTM_GETTIPBKCOLOR        ,0),
1541           USM(TTM_GETTIPTEXTCOLOR      ,0),
1542           USM(TTM_SETMAXTIPWIDTH       ,0),
1543           USM(TTM_GETMAXTIPWIDTH       ,0),
1544           USM(TTM_SETMARGIN            ,0),
1545           USM(TTM_GETMARGIN            ,0),
1546           USM(TTM_POP                  ,0),
1547           USM(TTM_UPDATE               ,0),
1548           USM(TTM_GETBUBBLESIZE        ,0),
1549           USM(TTM_ADDTOOLW             ,0),
1550           USM(TTM_DELTOOLW             ,0),
1551           USM(TTM_NEWTOOLRECTW         ,0),
1552           USM(TTM_GETTOOLINFOW         ,0),
1553           USM(TTM_SETTOOLINFOW         ,0),
1554           USM(TTM_HITTESTW             ,0),
1555           USM(TTM_GETTEXTW             ,0),
1556           USM(TTM_UPDATETIPTEXTW       ,0),
1557           USM(TTM_ENUMTOOLSW           ,0),
1558           USM(TTM_GETCURRENTTOOLW      ,0),
1559           {0,0,0} };
1560
1561 static const USER_MSG comboex_array[] = {
1562           USM(CBEM_INSERTITEMA        ,0),
1563           USM(CBEM_SETIMAGELIST       ,0),
1564           USM(CBEM_GETIMAGELIST       ,0),
1565           USM(CBEM_GETITEMA           ,0),
1566           USM(CBEM_SETITEMA           ,0),
1567           USM(CBEM_GETCOMBOCONTROL    ,0),
1568           USM(CBEM_GETEDITCONTROL     ,0),
1569           USM(CBEM_SETEXSTYLE         ,0),
1570           USM(CBEM_GETEXTENDEDSTYLE   ,0),
1571           USM(CBEM_HASEDITCHANGED     ,0),
1572           USM(CBEM_INSERTITEMW        ,0),
1573           USM(CBEM_SETITEMW           ,0),
1574           USM(CBEM_GETITEMW           ,0),
1575           USM(CBEM_SETEXTENDEDSTYLE   ,0),
1576           {0,0,0} };
1577
1578 static const USER_MSG propsht_array[] = {
1579           USM(PSM_SETCURSEL           ,0),
1580           USM(PSM_REMOVEPAGE          ,0),
1581           USM(PSM_ADDPAGE             ,0),
1582           USM(PSM_CHANGED             ,0),
1583           USM(PSM_RESTARTWINDOWS      ,0),
1584           USM(PSM_REBOOTSYSTEM        ,0),
1585           USM(PSM_CANCELTOCLOSE       ,0),
1586           USM(PSM_QUERYSIBLINGS       ,0),
1587           USM(PSM_UNCHANGED           ,0),
1588           USM(PSM_APPLY               ,0),
1589           USM(PSM_SETTITLEA           ,0),
1590           USM(PSM_SETWIZBUTTONS       ,0),
1591           USM(PSM_PRESSBUTTON         ,0),
1592           USM(PSM_SETCURSELID         ,0),
1593           USM(PSM_SETFINISHTEXTA      ,0),
1594           USM(PSM_GETTABCONTROL       ,0),
1595           USM(PSM_ISDIALOGMESSAGE     ,0),
1596           USM(PSM_GETCURRENTPAGEHWND  ,0),
1597           USM(PSM_SETTITLEW           ,0),
1598           USM(PSM_SETFINISHTEXTW      ,0),
1599           {0,0,0} };
1600 static const WCHAR PropSheetInfoStr[] =
1601     {'P','r','o','p','e','r','t','y','S','h','e','e','t','I','n','f','o',0 };
1602
1603 static const USER_MSG updown_array[] = {
1604           USM(UDM_SETRANGE            ,0),
1605           USM(UDM_GETRANGE            ,0),
1606           USM(UDM_SETPOS              ,0),
1607           USM(UDM_GETPOS              ,0),
1608           USM(UDM_SETBUDDY            ,0),
1609           USM(UDM_GETBUDDY            ,0),
1610           USM(UDM_SETACCEL            ,0),
1611           USM(UDM_GETACCEL            ,0),
1612           USM(UDM_SETBASE             ,0),
1613           USM(UDM_GETBASE             ,0),
1614           USM(UDM_SETRANGE32          ,0),
1615           USM(UDM_GETRANGE32          ,0),
1616           USM(UDM_SETPOS32            ,0),
1617           USM(UDM_GETPOS32            ,0),
1618           {0,0,0} };
1619
1620 /* generated from:
1621  * $ for i in `grep EM_ include/richedit.h | cut -d' ' -f2 | cut -f1`; do echo -e "          USM($i\t\t,0),"; done
1622  */
1623 static const USER_MSG richedit_array[] = {
1624           {"EM_SCROLLCARET", WM_USER+49 ,0},
1625           USM(EM_CANPASTE               ,0),
1626           USM(EM_DISPLAYBAND            ,0),
1627           USM(EM_EXGETSEL               ,0),
1628           USM(EM_EXLIMITTEXT            ,0),
1629           USM(EM_EXLINEFROMCHAR         ,0),
1630           USM(EM_EXSETSEL               ,0),
1631           USM(EM_FINDTEXT               ,0),
1632           USM(EM_FORMATRANGE            ,0),
1633           USM(EM_GETCHARFORMAT          ,0),
1634           USM(EM_GETEVENTMASK           ,0),
1635           USM(EM_GETOLEINTERFACE        ,0),
1636           USM(EM_GETPARAFORMAT          ,0),
1637           USM(EM_GETSELTEXT             ,0),
1638           USM(EM_HIDESELECTION          ,0),
1639           USM(EM_PASTESPECIAL           ,0),
1640           USM(EM_REQUESTRESIZE          ,0),
1641           USM(EM_SELECTIONTYPE          ,0),
1642           USM(EM_SETBKGNDCOLOR          ,0),
1643           USM(EM_SETCHARFORMAT          ,0),
1644           USM(EM_SETEVENTMASK           ,0),
1645           USM(EM_SETOLECALLBACK         ,0),
1646           USM(EM_SETPARAFORMAT          ,0),
1647           USM(EM_SETTARGETDEVICE        ,0),
1648           USM(EM_STREAMIN               ,0),
1649           USM(EM_STREAMOUT              ,0),
1650           USM(EM_GETTEXTRANGE           ,0),
1651           USM(EM_FINDWORDBREAK          ,0),
1652           USM(EM_SETOPTIONS             ,0),
1653           USM(EM_GETOPTIONS             ,0),
1654           USM(EM_FINDTEXTEX             ,0),
1655           USM(EM_GETWORDBREAKPROCEX     ,0),
1656           USM(EM_SETWORDBREAKPROCEX     ,0),
1657           USM(EM_SETUNDOLIMIT           ,0),
1658           USM(EM_REDO                   ,0),
1659           USM(EM_CANREDO                ,0),
1660           USM(EM_GETUNDONAME            ,0),
1661           USM(EM_GETREDONAME            ,0),
1662           USM(EM_STOPGROUPTYPING        ,0),
1663           USM(EM_SETTEXTMODE            ,0),
1664           USM(EM_GETTEXTMODE            ,0),
1665           USM(EM_AUTOURLDETECT          ,0),
1666           USM(EM_GETAUTOURLDETECT       ,0),
1667           USM(EM_SETPALETTE             ,0),
1668           USM(EM_GETTEXTEX              ,0),
1669           USM(EM_GETTEXTLENGTHEX        ,0),
1670           USM(EM_SHOWSCROLLBAR          ,0),
1671           USM(EM_SETTEXTEX              ,0),
1672           USM(EM_SETPUNCTUATION         ,0),
1673           USM(EM_GETPUNCTUATION         ,0),
1674           USM(EM_SETWORDWRAPMODE        ,0),
1675           USM(EM_GETWORDWRAPMODE        ,0),
1676           USM(EM_SETIMECOLOR            ,0),
1677           USM(EM_GETIMECOLOR            ,0),
1678           USM(EM_SETIMEOPTIONS          ,0),
1679           USM(EM_GETIMEOPTIONS          ,0),
1680           USM(EM_CONVPOSITION           ,0),
1681           USM(EM_SETLANGOPTIONS         ,0),
1682           USM(EM_GETLANGOPTIONS         ,0),
1683           USM(EM_GETIMECOMPMODE         ,0),
1684           USM(EM_FINDTEXTW              ,0),
1685           USM(EM_FINDTEXTEXW            ,0),
1686           USM(EM_RECONVERSION           ,0),
1687           USM(EM_SETIMEMODEBIAS         ,0),
1688           USM(EM_GETIMEMODEBIAS         ,0),
1689           USM(EM_SETBIDIOPTIONS         ,0),
1690           USM(EM_GETBIDIOPTIONS         ,0),
1691           USM(EM_SETTYPOGRAPHYOPTIONS   ,0),
1692           USM(EM_GETTYPOGRAPHYOPTIONS   ,0),
1693           USM(EM_SETEDITSTYLE           ,0),
1694           USM(EM_GETEDITSTYLE           ,0),
1695           USM(EM_OUTLINE                ,0),
1696           USM(EM_GETSCROLLPOS           ,0),
1697           USM(EM_SETSCROLLPOS           ,0),
1698           USM(EM_SETFONTSIZE            ,0),
1699           USM(EM_GETZOOM                ,0),
1700           USM(EM_SETZOOM                ,0),
1701           {0,0,0} };
1702
1703 #undef SZOF
1704 #undef USM
1705
1706 static CONTROL_CLASS  cc_array[] = {
1707     {WC_COMBOBOXEXW,    comboex_array,  0},
1708     {WC_PROPSHEETW,     propsht_array,  0},
1709     {REBARCLASSNAMEW,   rebar_array,    0},
1710     {TOOLBARCLASSNAMEW, toolbar_array,  0},
1711     {TOOLTIPS_CLASSW,   tooltips_array, 0},
1712     {UPDOWN_CLASSW,     updown_array,   0},
1713     {RICHEDIT_CLASS20W, richedit_array, 0},
1714     {0, 0, 0} };
1715
1716
1717 /************************************************************************/
1718
1719
1720 /* WM_NOTIFY function codes display */
1721
1722 typedef struct
1723 {
1724     const char *name;     /* name of notify message        */
1725     UINT        value;     /* notify code value             */
1726     UINT        len;       /* length of extra space to dump */
1727 } SPY_NOTIFY;
1728
1729 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1730
1731 /* Array MUST be in descending order by the 'value' field  */
1732 /* (since value is UNSIGNED, 0xffffffff is largest and     */
1733 /*  0xfffffffe is smaller). A binary search is used to     */
1734 /* locate the correct 'value'.                             */
1735 static const SPY_NOTIFY spnfy_array[] = {
1736     /*  common        0U       to  0U-99U  */
1737     SPNFY(NM_OUTOFMEMORY,        NMHDR),
1738     SPNFY(NM_CLICK,              NMHDR),
1739     SPNFY(NM_DBLCLK,             NMHDR),
1740     SPNFY(NM_RETURN,             NMHDR),
1741     SPNFY(NM_RCLICK,             NMHDR),
1742     SPNFY(NM_RDBLCLK,            NMHDR),
1743     SPNFY(NM_SETFOCUS,           NMHDR),
1744     SPNFY(NM_KILLFOCUS,          NMHDR),
1745     SPNFY(NM_CUSTOMDRAW,         NMCUSTOMDRAW),
1746     SPNFY(NM_HOVER,              NMHDR),
1747     SPNFY(NM_NCHITTEST,          NMMOUSE),
1748     SPNFY(NM_KEYDOWN,            NMKEY),
1749     SPNFY(NM_RELEASEDCAPTURE,    NMHDR),
1750     SPNFY(NM_SETCURSOR,          NMMOUSE),
1751     SPNFY(NM_CHAR,               NMCHAR),
1752     SPNFY(NM_TOOLTIPSCREATED,    NMTOOLTIPSCREATED),
1753     /* Listview       0U-100U  to  0U-199U  */
1754     SPNFY(LVN_ITEMCHANGING,      NMLISTVIEW),
1755     SPNFY(LVN_ITEMCHANGED,       NMLISTVIEW),
1756     SPNFY(LVN_INSERTITEM,        NMLISTVIEW),
1757     SPNFY(LVN_DELETEITEM,        NMLISTVIEW),
1758     SPNFY(LVN_DELETEALLITEMS,    NMLISTVIEW),
1759     SPNFY(LVN_BEGINLABELEDITA,   NMLVDISPINFOA),
1760     SPNFY(LVN_ENDLABELEDITA,     NMLVDISPINFOA),
1761     SPNFY(LVN_COLUMNCLICK,       NMLISTVIEW),
1762     SPNFY(LVN_BEGINDRAG,         NMLISTVIEW),
1763     SPNFY(LVN_BEGINRDRAG,        NMLISTVIEW),
1764     SPNFY(LVN_ODCACHEHINT,       NMLVCACHEHINT),
1765     SPNFY(LVN_ITEMACTIVATE,      NMITEMACTIVATE),
1766     SPNFY(LVN_ODSTATECHANGED,    NMLVODSTATECHANGE),
1767     SPNFY(LVN_HOTTRACK,          NMLISTVIEW),
1768     SPNFY(LVN_GETDISPINFOA,      NMLVDISPINFOA),
1769     SPNFY(LVN_SETDISPINFOA,      NMLVDISPINFOA),
1770     SPNFY(LVN_ODFINDITEMA,       NMLVFINDITEMA),
1771     SPNFY(LVN_KEYDOWN,           NMLVKEYDOWN),
1772     SPNFY(LVN_MARQUEEBEGIN,      NMLISTVIEW),
1773     SPNFY(LVN_GETINFOTIPA,       NMLVGETINFOTIPA),
1774     SPNFY(LVN_GETINFOTIPW,       NMLVGETINFOTIPW),
1775     SPNFY(LVN_BEGINLABELEDITW,   NMLVDISPINFOW),
1776     SPNFY(LVN_ENDLABELEDITW,     NMLVDISPINFOW),
1777     SPNFY(LVN_GETDISPINFOW,      NMLVDISPINFOW),
1778     SPNFY(LVN_SETDISPINFOW,      NMLVDISPINFOW),
1779     SPNFY(LVN_ODFINDITEMW,       NMLVFINDITEMW),
1780     /* PropertySheet  0U-200U  to  0U-299U  */
1781     SPNFY(PSN_SETACTIVE,         PSHNOTIFY),
1782     SPNFY(PSN_KILLACTIVE,        PSHNOTIFY),
1783     SPNFY(PSN_APPLY,             PSHNOTIFY),
1784     SPNFY(PSN_RESET,             PSHNOTIFY),
1785     SPNFY(PSN_HELP,              PSHNOTIFY),
1786     SPNFY(PSN_WIZBACK,           PSHNOTIFY),
1787     SPNFY(PSN_WIZNEXT,           PSHNOTIFY),
1788     SPNFY(PSN_WIZFINISH,         PSHNOTIFY),
1789     SPNFY(PSN_QUERYCANCEL,       PSHNOTIFY),
1790     SPNFY(PSN_GETOBJECT,         NMOBJECTNOTIFY),
1791     SPNFY(PSN_TRANSLATEACCELERATOR, PSHNOTIFY),
1792     SPNFY(PSN_QUERYINITIALFOCUS, PSHNOTIFY),
1793     /* Header         0U-300U  to  0U-399U  */
1794     SPNFY(HDN_ITEMCHANGINGA,     NMHEADERA),
1795     SPNFY(HDN_ITEMCHANGEDA,      NMHEADERA),
1796     SPNFY(HDN_ITEMCLICKA,        NMHEADERA),
1797     SPNFY(HDN_ITEMDBLCLICKA,     NMHEADERA),
1798     SPNFY(HDN_DIVIDERDBLCLICKA,  NMHEADERA),
1799     SPNFY(HDN_BEGINTRACKA,       NMHEADERA),
1800     SPNFY(HDN_ENDTRACKA,         NMHEADERA),
1801     SPNFY(HDN_TRACKA,            NMHEADERA),
1802     SPNFY(HDN_GETDISPINFOA,      NMHEADERA),
1803     SPNFY(HDN_BEGINDRAG,         NMHDR),
1804     SPNFY(HDN_ENDDRAG,           NMHDR),
1805     SPNFY(HDN_ITEMCHANGINGW,     NMHDR),
1806     SPNFY(HDN_ITEMCHANGEDW,      NMHDR),
1807     SPNFY(HDN_ITEMCLICKW,        NMHDR),
1808     SPNFY(HDN_ITEMDBLCLICKW,     NMHDR),
1809     SPNFY(HDN_DIVIDERDBLCLICKW,  NMHDR),
1810     SPNFY(HDN_BEGINTRACKW,       NMHDR),
1811     SPNFY(HDN_ENDTRACKW,         NMHDR),
1812     SPNFY(HDN_TRACKW,            NMHDR),
1813     SPNFY(HDN_GETDISPINFOW,      NMHDR),
1814     /* Treeview       0U-400U  to  0U-499U  */
1815     SPNFY(TVN_SELCHANGINGA,      NMTREEVIEWA),
1816     SPNFY(TVN_SELCHANGEDA,       NMTREEVIEWA),
1817     SPNFY(TVN_GETDISPINFOA,      NMTVDISPINFOA),
1818     SPNFY(TVN_SETDISPINFOA,      NMTVDISPINFOA),
1819     SPNFY(TVN_ITEMEXPANDINGA,    NMTREEVIEWA),
1820     SPNFY(TVN_ITEMEXPANDEDA,     NMTREEVIEWA),
1821     SPNFY(TVN_BEGINDRAGA,        NMTREEVIEWA),
1822     SPNFY(TVN_BEGINRDRAGA,       NMTREEVIEWA),
1823     SPNFY(TVN_DELETEITEMA,       NMTREEVIEWA),
1824     SPNFY(TVN_BEGINLABELEDITA,   NMTVDISPINFOA),
1825     SPNFY(TVN_ENDLABELEDITA,     NMTVDISPINFOA),
1826     SPNFY(TVN_KEYDOWN,           NMTVKEYDOWN),
1827     SPNFY(TVN_SELCHANGINGW,      NMTREEVIEWW),
1828     SPNFY(TVN_SELCHANGEDW,       NMTREEVIEWW),
1829     SPNFY(TVN_GETDISPINFOW,      NMTVDISPINFOW),
1830     SPNFY(TVN_SETDISPINFOW,      NMTVDISPINFOW),
1831     SPNFY(TVN_ITEMEXPANDINGW,    NMTREEVIEWW),
1832     SPNFY(TVN_ITEMEXPANDEDW,     NMTREEVIEWW),
1833     SPNFY(TVN_BEGINDRAGW,        NMTREEVIEWW),
1834     SPNFY(TVN_BEGINRDRAGW,       NMTREEVIEWW),
1835     SPNFY(TVN_DELETEITEMW,       NMTREEVIEWW),
1836     SPNFY(TVN_BEGINLABELEDITW,   NMTVDISPINFOW),
1837     SPNFY(TVN_ENDLABELEDITW,     NMTVDISPINFOW),
1838     /* Tooltips       0U-520U  to  0U-549U  */
1839     SPNFY(TTN_GETDISPINFOA,      NMHDR),
1840     SPNFY(TTN_SHOW,              NMHDR),
1841     SPNFY(TTN_POP,               NMHDR),
1842     SPNFY(TTN_GETDISPINFOW,      NMHDR),
1843     /* Tab            0U-550U  to  0U-580U  */
1844     SPNFY(TCN_KEYDOWN,           NMHDR),
1845     SPNFY(TCN_SELCHANGE,         NMHDR),
1846     SPNFY(TCN_SELCHANGING,       NMHDR),
1847     SPNFY(TCN_GETOBJECT,         NMHDR),
1848     /* Common Dialog  0U-601U  to  0U-699U  */
1849     SPNFY(CDN_INITDONE,          OFNOTIFYA),
1850     SPNFY(CDN_SELCHANGE,         OFNOTIFYA),
1851     SPNFY(CDN_FOLDERCHANGE,      OFNOTIFYA),
1852     SPNFY(CDN_SHAREVIOLATION,    OFNOTIFYA),
1853     SPNFY(CDN_HELP,              OFNOTIFYA),
1854     SPNFY(CDN_FILEOK,            OFNOTIFYA),
1855     SPNFY(CDN_TYPECHANGE,        OFNOTIFYA),
1856     /* Toolbar        0U-700U  to  0U-720U  */
1857     SPNFY(TBN_GETBUTTONINFOA,    NMTOOLBARA),
1858     SPNFY(TBN_BEGINDRAG,         NMTOOLBARA),
1859     SPNFY(TBN_ENDDRAG,           NMTOOLBARA),
1860     SPNFY(TBN_BEGINADJUST,       NMHDR),
1861     SPNFY(TBN_ENDADJUST,         NMHDR),
1862     SPNFY(TBN_RESET,             NMHDR),
1863     SPNFY(TBN_QUERYINSERT,       NMTOOLBARA),
1864     SPNFY(TBN_QUERYDELETE,       NMTOOLBARA),
1865     SPNFY(TBN_TOOLBARCHANGE,     NMHDR),
1866     SPNFY(TBN_CUSTHELP,          NMHDR),
1867     SPNFY(TBN_DROPDOWN,          NMTOOLBARA),
1868     SPNFY(TBN_GETOBJECT,         NMOBJECTNOTIFY),
1869     SPNFY(TBN_HOTITEMCHANGE,     NMTBHOTITEM),
1870     SPNFY(TBN_DRAGOUT,           NMTOOLBARA),
1871     SPNFY(TBN_DELETINGBUTTON,    NMTOOLBARA),
1872     SPNFY(TBN_GETDISPINFOA,      NMTBDISPINFOA),
1873     SPNFY(TBN_GETDISPINFOW,      NMTBDISPINFOW),
1874     SPNFY(TBN_GETINFOTIPA,       NMTBGETINFOTIPA),
1875     SPNFY(TBN_GETINFOTIPW,       NMTBGETINFOTIPW),
1876     SPNFY(TBN_GETBUTTONINFOW,    NMTOOLBARW),
1877     /* Up/Down        0U-721U  to  0U-740U  */
1878     SPNFY(UDN_DELTAPOS,          NM_UPDOWN),
1879     /* Month Calendar 0U-750U  to  0U-759U  */
1880     /* ******************* WARNING ***************************** */
1881     /* The following appear backwards but needs to be this way.  */
1882     /* The reason is that MS (and us) define the MCNs as         */
1883     /*         MCN_FIRST + n                                     */
1884     /* instead of the way ALL other notifications are            */
1885     /*         TBN_FIRST - n                                     */
1886     /* The only place that this is important is in this list     */
1887     /*                                                           */
1888     /* Also since the same error was made with the DTN_ items,   */
1889     /* they overlay the MCN_ and need to be inserted in the      */
1890     /* other section of the table so that it is in order for     */
1891     /* the binary search.                                        */
1892     /*                                                           */
1893     /* Thank you MS for your obvious quality control!!           */
1894     /* ******************* WARNING ***************************** */
1895     /* Date/Time      0U-760U  to  0U-799U  */
1896     /* SPNFY(MCN_SELECT,            NMHDR), */
1897     /* SPNFY(MCN_GETDAYSTATE,       NMHDR), */
1898     /* SPNFY(MCN_SELCHANGE,         NMHDR), */
1899     /* ******************* WARNING ***************************** */
1900     /* The following appear backwards but needs to be this way.  */
1901     /* The reason is that MS (and us) define the MCNs as         */
1902     /*         DTN_FIRST + n                                     */
1903     /* instead of the way ALL other notifications are            */
1904     /*         TBN_FIRST - n                                     */
1905     /* The only place that this is important is in this list     */
1906     /* ******************* WARNING ***************************** */
1907     SPNFY(DTN_FORMATQUERYW,      NMHDR),
1908     SPNFY(DTN_FORMATW,           NMHDR),
1909     SPNFY(DTN_WMKEYDOWNW,        NMHDR),
1910     SPNFY(DTN_USERSTRINGW,       NMHDR),
1911     SPNFY(MCN_SELECT,            NMHDR),
1912     SPNFY(MCN_GETDAYSTATE,       NMHDR),
1913     SPNFY(MCN_SELCHANGE,         NMHDR),
1914     SPNFY(DTN_CLOSEUP,           NMHDR),
1915     SPNFY(DTN_DROPDOWN,          NMHDR),
1916     SPNFY(DTN_FORMATQUERYA,      NMHDR),
1917     SPNFY(DTN_FORMATA,           NMHDR),
1918     SPNFY(DTN_WMKEYDOWNA,        NMHDR),
1919     SPNFY(DTN_USERSTRINGA,       NMHDR),
1920     SPNFY(DTN_DATETIMECHANGE,    NMHDR),
1921     /* ComboBoxEx     0U-800U  to  0U-830U  */
1922     SPNFY(CBEN_GETDISPINFOA,     NMCOMBOBOXEXA),
1923     SPNFY(CBEN_INSERTITEM,       NMCOMBOBOXEXA),
1924     SPNFY(CBEN_DELETEITEM,       NMCOMBOBOXEXA),
1925     SPNFY(CBEN_BEGINEDIT,        NMHDR),
1926     SPNFY(CBEN_ENDEDITA,         NMCBEENDEDITA),
1927     SPNFY(CBEN_ENDEDITW,         NMCBEENDEDITW),
1928     SPNFY(CBEN_GETDISPINFOW,     NMCOMBOBOXEXW),
1929     SPNFY(CBEN_DRAGBEGINA,       NMCBEDRAGBEGINA),
1930     SPNFY(CBEN_DRAGBEGINW,       NMCBEDRAGBEGINW),
1931     /* Rebar          0U-831U  to  0U-859U  */
1932     SPNFY(RBN_HEIGHTCHANGE,      NMHDR),
1933     SPNFY(RBN_GETOBJECT,         NMOBJECTNOTIFY),
1934     SPNFY(RBN_LAYOUTCHANGED,     NMHDR),
1935     SPNFY(RBN_AUTOSIZE,          NMRBAUTOSIZE),
1936     SPNFY(RBN_BEGINDRAG,         NMREBAR),
1937     SPNFY(RBN_ENDDRAG,           NMREBAR),
1938     SPNFY(RBN_DELETINGBAND,      NMREBAR),
1939     SPNFY(RBN_DELETEDBAND,       NMREBAR),
1940     SPNFY(RBN_CHILDSIZE,         NMREBARCHILDSIZE),
1941     /* IP address     0U-860U  to  0U-879U  */
1942     SPNFY(IPN_FIELDCHANGED,      NMHDR),
1943     /* Status bar     0U-880U  to  0U-899U  */
1944     SPNFY(SBN_SIMPLEMODECHANGE,  NMHDR),
1945     /* Pager          0U-900U  to  0U-950U  */
1946     SPNFY(PGN_SCROLL,            NMPGSCROLL),
1947     SPNFY(PGN_CALCSIZE,          NMPGCALCSIZE),
1948     {0,0,0}};
1949 static const SPY_NOTIFY *end_spnfy_array;     /* ptr to last good entry in array */
1950 #undef SPNFY
1951
1952
1953 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
1954 static BOOL16 SPY_ExcludeDWP = 0;
1955
1956 #define SPY_EXCLUDE(msg) \
1957     (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
1958
1959
1960 typedef struct
1961 {
1962     UINT       msgnum;           /* message number */
1963     HWND       msg_hwnd;         /* window handle for message          */
1964     WPARAM     wParam;           /* message parameter                  */
1965     LPARAM     lParam;           /* message parameter                  */
1966     INT        data_len;         /* length of data to dump             */
1967     char       msg_name[60];     /* message name (see SPY_GetMsgName)  */
1968     WCHAR      wnd_class[60];    /* window class name (full)           */
1969     WCHAR      wnd_name[16];     /* window name for message            */
1970 } SPY_INSTANCE;
1971
1972 static int indent_tls_index;
1973
1974 /***********************************************************************
1975  *           get_indent_level
1976  */
1977 static inline INT_PTR get_indent_level(void)
1978 {
1979     return (INT_PTR)TlsGetValue( indent_tls_index );
1980 }
1981
1982
1983 /***********************************************************************
1984  *           set_indent_level
1985  */
1986 static inline void set_indent_level( INT_PTR level )
1987 {
1988     TlsSetValue( indent_tls_index, (void *)level );
1989 }
1990
1991
1992 /***********************************************************************
1993  *           SPY_GetMsgInternal
1994  */
1995 static const char *SPY_GetMsgInternal( UINT msg )
1996 {
1997     if (msg <= SPY_MAX_MSGNUM)
1998         return MessageTypeNames[msg];
1999
2000     if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
2001         return LVMMessageTypeNames[msg-LVM_FIRST];
2002
2003     if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
2004         return TVMessageTypeNames[msg-TV_FIRST];
2005
2006     if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
2007         return HDMMessageTypeNames[msg-HDM_FIRST];
2008
2009     if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
2010         return TCMMessageTypeNames[msg-TCM_FIRST];
2011
2012     if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
2013         return PGMMessageTypeNames[msg-PGM_FIRST];
2014
2015     if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
2016         return CCMMessageTypeNames[msg-CCM_FIRST];
2017
2018     if (msg >= WM_WINE_DESTROYWINDOW && msg <= WM_WINE_DESTROYWINDOW + SPY_MAX_WINEMSGNUM)
2019         return WINEMessageTypeNames[msg-WM_WINE_DESTROYWINDOW];
2020
2021     return NULL;
2022 }
2023
2024 /***********************************************************************
2025  *           SPY_Bsearch_Msg
2026  */
2027 static const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
2028 {
2029     INT count;
2030     const USER_MSG *test;
2031
2032     while (last >= first) {
2033         count = 1 + last - first;
2034         if (count < 3) {
2035 #if DEBUG_SPY
2036             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2037                code, first->value, first->name, last->value, last->name, last->len);
2038 #endif
2039             if (first->value == code) return first;
2040             if (last->value == code) return last;
2041             return NULL;
2042         }
2043         count = count / 2;
2044         test = first + count;
2045 #if DEBUG_SPY
2046         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2047            first, last, test, test->value, code, count);
2048 #endif
2049         if (test->value == code) return test;
2050         if (test->value > code)
2051             last = test - 1;
2052         else
2053             first = test + 1;
2054     }
2055     return NULL;
2056 }
2057
2058 /***********************************************************************
2059  *           SPY_GetClassLongOffsetName
2060  *
2061  * Gets the name of a class long offset.
2062  */
2063 const char *SPY_GetClassLongOffsetName( INT offset )
2064 {
2065     INT index;
2066     if (offset < 0 && offset % 2 == 0 && ((index = -(offset + 8) / 2) <
2067         sizeof(ClassLongOffsetNames) / sizeof(*ClassLongOffsetNames)))
2068     {
2069         return ClassLongOffsetNames[index];
2070     }
2071
2072     return "?";
2073 }
2074
2075 /***********************************************************************
2076  *           SPY_GetClassName
2077  *
2078  *  Sets the value of "wnd_class" member of the instance structure.
2079  */
2080 static void SPY_GetClassName( SPY_INSTANCE *sp_e )
2081 {
2082     DWORD save_error;
2083
2084     /* save and restore error code over the next call */
2085     save_error = GetLastError();
2086     /* special code to detect a property sheet dialog   */
2087     if ((GetClassLongW(sp_e->msg_hwnd, GCW_ATOM) == WC_DIALOG) &&
2088         (GetPropW(sp_e->msg_hwnd, PropSheetInfoStr))) {
2089         strcpyW(sp_e->wnd_class, WC_PROPSHEETW);
2090     }
2091     else {
2092         GetClassNameW(sp_e->msg_hwnd, sp_e->wnd_class, sizeof(sp_e->wnd_class)/sizeof(WCHAR));
2093     }
2094     SetLastError(save_error);
2095 }
2096
2097 /***********************************************************************
2098  *           SPY_GetMsgStuff
2099  *
2100  *  Get message name and other information for dumping
2101  */
2102 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
2103 {
2104     const USER_MSG *p;
2105     const char *msg_name = SPY_GetMsgInternal( sp_e->msgnum );
2106
2107     sp_e->data_len = 0;
2108     if (!msg_name)
2109     {
2110         INT i = 0;
2111
2112         if (sp_e->msgnum >= 0xc000)
2113         {
2114             if (GlobalGetAtomNameA( sp_e->msgnum, sp_e->msg_name+1, sizeof(sp_e->msg_name)-2 ))
2115             {
2116                 sp_e->msg_name[0] = '\"';
2117                 strcat( sp_e->msg_name, "\"" );
2118                 return;
2119             }
2120         }
2121         if (!sp_e->wnd_class[0]) SPY_GetClassName(sp_e);
2122
2123 #if DEBUG_SPY
2124         TRACE("looking class %s\n", debugstr_w(sp_e->wnd_class));
2125 #endif
2126
2127         while (cc_array[i].classname &&
2128                strcmpiW(cc_array[i].classname, sp_e->wnd_class) != 0) i++;
2129
2130         if (cc_array[i].classname)
2131         {
2132 #if DEBUG_SPY
2133             TRACE("process class %s, first %p, last %p\n",
2134                   debugstr_w(cc_array[i].classname), cc_array[i].classmsg,
2135                   cc_array[i].lastmsg);
2136 #endif
2137             p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
2138                                  sp_e->msgnum);
2139             if (p) {
2140                 lstrcpynA (sp_e->msg_name, p->name, sizeof(sp_e->msg_name));
2141                 sp_e->data_len = p->len;
2142                 return;
2143             }
2144         }
2145         if (sp_e->msgnum >= WM_USER && sp_e->msgnum <= WM_APP)
2146             sprintf( sp_e->msg_name, "WM_USER+%d", sp_e->msgnum - WM_USER );
2147         else
2148             sprintf( sp_e->msg_name, "%04x", sp_e->msgnum );
2149     }
2150     else
2151     {
2152         lstrcpynA(sp_e->msg_name, msg_name, sizeof(sp_e->msg_name));
2153     }
2154 }
2155
2156 /***********************************************************************
2157  *           SPY_GetWndName
2158  *
2159  *  Sets the value of "wnd_name" and "wnd_class" members of the
2160  *  instance structure.
2161  *
2162  */
2163 static void SPY_GetWndName( SPY_INSTANCE *sp_e )
2164 {
2165     INT len;
2166
2167     SPY_GetClassName( sp_e );
2168
2169     len = InternalGetWindowText(sp_e->msg_hwnd, sp_e->wnd_name, sizeof(sp_e->wnd_name)/sizeof(WCHAR));
2170     if(!len) /* get class name */
2171     {
2172         LPWSTR dst = sp_e->wnd_name;
2173         LPWSTR src = sp_e->wnd_class;
2174         int n = sizeof(sp_e->wnd_name)/sizeof(WCHAR) - 3;
2175         *dst++ = '{';
2176         while ((n-- > 0) && *src) *dst++ = *src++;
2177         *dst++ = '}';
2178         *dst = 0;
2179     }
2180 }
2181
2182 /***********************************************************************
2183  *           SPY_GetMsgName
2184  *
2185  *  ****  External function  ****
2186  *
2187  *  Get message name
2188  */
2189 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
2190 {
2191     SPY_INSTANCE ext_sp_e;
2192
2193     ext_sp_e.msgnum = msg;
2194     ext_sp_e.msg_hwnd   = hWnd;
2195     ext_sp_e.lParam = 0;
2196     ext_sp_e.wParam = 0;
2197     ext_sp_e.wnd_class[0] = 0;
2198     SPY_GetMsgStuff(&ext_sp_e);
2199     return wine_dbg_sprintf("%s", ext_sp_e.msg_name);
2200 }
2201
2202 /***********************************************************************
2203  *           SPY_GetVKeyName
2204  */
2205 const char *SPY_GetVKeyName(WPARAM wParam)
2206 {
2207     const char *vk_key_name;
2208
2209     if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
2210         vk_key_name = VK_KeyNames[wParam];
2211     else
2212         vk_key_name = "VK_???";
2213
2214     return vk_key_name;
2215 }
2216
2217 /***********************************************************************
2218  *           SPY_Bsearch_Notify
2219  */
2220 static const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
2221 {
2222     INT count;
2223     const SPY_NOTIFY *test;
2224
2225     while (last >= first) {
2226         count = 1 + last - first;
2227         if (count < 3) {
2228 #if DEBUG_SPY
2229             TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
2230                code, first->value, first->name, last->value, last->name, last->len);
2231 #endif
2232             if (first->value == code) return first;
2233             if (last->value == code) return last;
2234             return NULL;
2235         }
2236         count = count / 2;
2237         test = first + count;
2238 #if DEBUG_SPY
2239         TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
2240            first, last, test, test->value, code, count);
2241 #endif
2242         if (test->value == code) return test;
2243         if (test->value < code)
2244             last = test - 1;
2245         else
2246             first = test + 1;
2247     }
2248     return NULL;
2249 }
2250
2251 /***********************************************************************
2252  *           SPY_DumpMem
2253  */
2254 static void SPY_DumpMem (LPCSTR header, const UINT *q, INT len)
2255 {
2256     int i;
2257
2258     for(i=0; i<len-12; i+=16) {
2259         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2260               header, i, *q, *(q+1), *(q+2), *(q+3));
2261         q += 4;
2262     }
2263     switch ((len - i + 3) & (~3)) {
2264     case 16:
2265         TRACE("%s [%04x] %08x %08x %08x %08x\n",
2266               header, i, *q, *(q+1), *(q+2), *(q+3));
2267         break;
2268     case 12:
2269         TRACE("%s [%04x] %08x %08x %08x\n",
2270               header, i, *q, *(q+1), *(q+2));
2271         break;
2272     case 8:
2273         TRACE("%s [%04x] %08x %08x\n",
2274               header, i, *q, *(q+1));
2275         break;
2276     case 4:
2277         TRACE("%s [%04x] %08x\n",
2278               header, i, *q);
2279         break;
2280     default:
2281         break;
2282     }
2283 }
2284
2285 /***********************************************************************
2286  *           SPY_DumpStructure
2287  */
2288 static void SPY_DumpStructure(const SPY_INSTANCE *sp_e, BOOL enter)
2289 {
2290     switch (sp_e->msgnum)
2291         {
2292         case LVM_INSERTITEMW:
2293         case LVM_INSERTITEMA:
2294         case LVM_SETITEMW:
2295         case LVM_SETITEMA:
2296             if (!enter) break;
2297             /* fall through */
2298         case LVM_GETITEMW:
2299         case LVM_GETITEMA:
2300             {
2301                 LPLVITEMA item = (LPLVITEMA) sp_e->lParam;
2302                 if (item) {
2303                     SPY_DumpMem ("LVITEM", (UINT*)item, sizeof(LVITEMA));
2304                 }
2305                 break;
2306             }
2307         case TCM_INSERTITEMW:
2308         case TCM_INSERTITEMA:
2309         case TCM_SETITEMW:
2310         case TCM_SETITEMA:
2311             if (!enter) break;
2312             /* fall through */
2313         case TCM_GETITEMW:
2314         case TCM_GETITEMA:
2315             {
2316                 TCITEMA *item = (TCITEMA *) sp_e->lParam;
2317                 if (item) {
2318                     SPY_DumpMem ("TCITEM", (UINT*)item, sizeof(TCITEMA));
2319                 }
2320                 break;
2321             }
2322         case TCM_ADJUSTRECT:
2323         case LVM_GETITEMRECT:
2324         case LVM_GETSUBITEMRECT:
2325             {
2326                 LPRECT rc = (LPRECT) sp_e->lParam;
2327                 if (rc)
2328                     TRACE("lParam rect (%s)\n", wine_dbgstr_rect(rc));
2329                 break;
2330             }
2331         case LVM_SETITEMPOSITION32:
2332             if (!enter) break;
2333             /* fall through */
2334         case LVM_GETITEMPOSITION:
2335         case LVM_GETORIGIN:
2336             {
2337                 LPPOINT point = (LPPOINT) sp_e->lParam;
2338                 if (point) {
2339                     TRACE("lParam point x=%d, y=%d\n", point->x, point->y);
2340                 }
2341                 break;
2342             }
2343         case SBM_SETRANGE:
2344             if (!enter && (sp_e->msgnum == SBM_SETRANGE)) break;
2345             TRACE("min=%d max=%d\n", (INT)sp_e->wParam, (INT)sp_e->lParam);
2346             break;
2347         case SBM_GETRANGE:
2348             if ((enter && (sp_e->msgnum == SBM_GETRANGE)) ||
2349                 (!enter && (sp_e->msgnum == SBM_SETRANGE))) break;
2350             {
2351                 LPINT ptmin = (LPINT) sp_e->wParam;
2352                 LPINT ptmax = (LPINT) sp_e->lParam;
2353                 if (ptmin && ptmax)
2354                     TRACE("min=%d max=%d\n", *ptmin, *ptmax);
2355                 else if (ptmin)
2356                     TRACE("min=%d max=n/a\n", *ptmin);
2357                 else if (ptmax)
2358                     TRACE("min=n/a max=%d\n", *ptmax);
2359                 break;
2360             }
2361         case EM_EXSETSEL:
2362             if (enter && sp_e->lParam)
2363             {
2364                 CHARRANGE *cr = (CHARRANGE *) sp_e->lParam;
2365                 TRACE("CHARRANGE: cpMin=%d cpMax=%d\n", cr->cpMin, cr->cpMax);
2366             }
2367             break;
2368         case EM_SETCHARFORMAT:
2369             if (enter && sp_e->lParam)
2370             {
2371                 CHARFORMATW *cf = (CHARFORMATW *) sp_e->lParam;
2372                 TRACE("CHARFORMAT: dwMask=0x%08x dwEffects=", cf->dwMask);
2373                 if ((cf->dwMask & CFM_BOLD) && (cf->dwEffects & CFE_BOLD))
2374                     TRACE(" CFE_BOLD");
2375                 if ((cf->dwMask & CFM_COLOR) && (cf->dwEffects & CFE_AUTOCOLOR))
2376                     TRACE(" CFE_AUTOCOLOR");
2377                 if ((cf->dwMask & CFM_ITALIC) && (cf->dwEffects & CFE_ITALIC))
2378                     TRACE(" CFE_ITALIC");
2379                 if ((cf->dwMask & CFM_PROTECTED) && (cf->dwEffects & CFE_PROTECTED))
2380                     TRACE(" CFE_PROTECTED");
2381                 if ((cf->dwMask & CFM_STRIKEOUT) && (cf->dwEffects & CFE_STRIKEOUT))
2382                     TRACE(" CFE_STRIKEOUT");
2383                 if ((cf->dwMask & CFM_UNDERLINE) && (cf->dwEffects & CFE_UNDERLINE))
2384                     TRACE(" CFE_UNDERLINE");
2385                 TRACE("\n");
2386                 if (cf->dwMask & CFM_SIZE)
2387                     TRACE("yHeight=%d\n", cf->yHeight);
2388                 if (cf->dwMask & CFM_OFFSET)
2389                     TRACE("yOffset=%d\n", cf->yOffset);
2390                 if ((cf->dwMask & CFM_COLOR) && !(cf->dwEffects & CFE_AUTOCOLOR))
2391                     TRACE("crTextColor=%x\n", cf->crTextColor);
2392                 TRACE("bCharSet=%x bPitchAndFamily=%x\n", cf->bCharSet, cf->bPitchAndFamily);
2393                 /* FIXME: we should try to be a bit more intelligent about
2394                  * whether this is in ANSI or Unicode (it could be either) */
2395                 if (cf->dwMask & CFM_FACE)
2396                     TRACE("szFaceName=%s\n", debugstr_wn(cf->szFaceName, LF_FACESIZE));
2397                 /* FIXME: handle CHARFORMAT2 too */
2398             }
2399             break;
2400         case WM_DRAWITEM:
2401             if (!enter) break;
2402             {
2403                 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
2404                 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2405                       lpdis->CtlType, lpdis->CtlID);
2406                 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
2407                       lpdis->itemID, lpdis->itemAction, lpdis->itemState);
2408                 TRACE("hWnd=%p hDC=%p (%s) itemData=0x%08lx\n",
2409                       lpdis->hwndItem, lpdis->hDC,
2410                       wine_dbgstr_rect(&lpdis->rcItem), lpdis->itemData);
2411             }
2412             break;
2413         case WM_MEASUREITEM:
2414             {
2415                 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
2416                 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
2417                       lpmis->CtlType, lpmis->CtlID);
2418                 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
2419                       lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
2420                 TRACE("itemData=0x%08lx\n", lpmis->itemData);
2421             }
2422             break;
2423         case WM_NCCREATE:
2424         case WM_CREATE:
2425         {
2426             BOOL unicode;
2427             CREATESTRUCTA *cs;
2428
2429             if (!enter) break;
2430
2431             unicode = IsWindowUnicode(sp_e->msg_hwnd);
2432             cs = (CREATESTRUCTA *)sp_e->lParam;
2433             TRACE("%s %s ex=%08x style=%08x %d,%d %dx%d parent=%p menu=%p inst=%p params=%p\n",
2434                   unicode ? debugstr_w((LPCWSTR)cs->lpszName) : debugstr_a(cs->lpszName),
2435                   unicode ? debugstr_w((LPCWSTR)cs->lpszClass) : debugstr_a(cs->lpszClass),
2436                   cs->dwExStyle, cs->style, cs->x, cs->y, cs->cx, cs->cy,
2437                   cs->hwndParent, cs->hMenu, cs->hInstance, cs->lpCreateParams);
2438             break;
2439         }
2440         case WM_SIZE:
2441             if (!enter) break;
2442             TRACE("cx=%d cy=%d\n", LOWORD(sp_e->lParam), HIWORD(sp_e->lParam));
2443             break;
2444         case WM_WINDOWPOSCHANGED:
2445             if (!enter) break;
2446         case WM_WINDOWPOSCHANGING:
2447             {
2448                 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
2449                 TRACE("WINDOWPOS hwnd=%p, after=%p, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
2450                       lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
2451                       lpwp->cx, lpwp->cy, lpwp->flags);
2452             }
2453             break;
2454         case WM_STYLECHANGED:
2455             if (!enter) break;
2456         case WM_STYLECHANGING:
2457             {
2458                 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
2459                 TRACE("STYLESTRUCT: StyleOld=0x%08x, StyleNew=0x%08x\n",
2460                       ss->styleOld, ss->styleNew);
2461             }
2462             break;
2463         case WM_NCCALCSIZE:
2464             {
2465                 RECT *rc = (RECT *)sp_e->lParam;
2466                 TRACE("Rect (%s)\n", wine_dbgstr_rect(rc));
2467             }
2468             break;
2469         case WM_NOTIFY:
2470             /* if (!enter) break; */
2471             {
2472                 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
2473                 UINT *q, dumplen;
2474                 const SPY_NOTIFY *p;
2475                 WCHAR from_class[60];
2476                 DWORD save_error;
2477
2478                 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
2479                                         pnmh->code);
2480                 if (p) {
2481                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=%s<0x%08x>, extra=0x%x\n",
2482                           pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
2483                     dumplen = p->len;
2484
2485                     /* for CUSTOMDRAW, dump all the data for TOOLBARs */
2486                     if (pnmh->code == NM_CUSTOMDRAW) {
2487                         /* save and restore error code over the next call */
2488                         save_error = GetLastError();
2489                         GetClassNameW(pnmh->hwndFrom, from_class,
2490                                       sizeof(from_class)/sizeof(WCHAR));
2491                         SetLastError(save_error);
2492                         if (strcmpW(TOOLBARCLASSNAMEW, from_class) == 0)
2493                             dumplen = sizeof(NMTBCUSTOMDRAW)-sizeof(NMHDR);
2494                     } else if ((pnmh->code >= HDN_ITEMCHANGINGA) && (pnmh->code <= HDN_ENDDRAG)) {
2495                         dumplen = sizeof(NMHEADERA)-sizeof(NMHDR);
2496                     }
2497                     if (dumplen > 0) {
2498                         q = (UINT *)(pnmh + 1);
2499                         SPY_DumpMem ("NM extra", q, (INT)dumplen);
2500                     }
2501                 }
2502                 else
2503                     TRACE("NMHDR hwndFrom=%p idFrom=0x%08lx code=0x%08x\n",
2504                           pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
2505             }
2506         default:
2507             if (sp_e->data_len > 0)
2508                 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
2509             break;
2510         }
2511
2512 }
2513 /***********************************************************************
2514  *           SPY_EnterMessage
2515  */
2516 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
2517                        WPARAM wParam, LPARAM lParam )
2518 {
2519     SPY_INSTANCE sp_e;
2520     int indent;
2521
2522     if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
2523
2524     sp_e.msgnum = msg;
2525     sp_e.msg_hwnd = hWnd;
2526     sp_e.lParam = lParam;
2527     sp_e.wParam = wParam;
2528     SPY_GetWndName(&sp_e);
2529     SPY_GetMsgStuff(&sp_e);
2530     indent = get_indent_level();
2531
2532     /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
2533     switch(iFlag)
2534     {
2535     case SPY_DISPATCHMESSAGE16:
2536         TRACE("%*s(%04x) %-16s message [%04x] %s dispatched  wp=%04lx lp=%08lx\n",
2537               indent, "", HWND_16(hWnd),
2538               debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name, wParam, lParam);
2539         break;
2540
2541     case SPY_DISPATCHMESSAGE:
2542         TRACE("%*s(%p) %-16s message [%04x] %s dispatched  wp=%08lx lp=%08lx\n",
2543                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2544                         sp_e.msg_name, wParam, lParam);
2545         break;
2546
2547     case SPY_SENDMESSAGE16:
2548     case SPY_SENDMESSAGE:
2549         {
2550             char taskName[20];
2551             DWORD tid = GetWindowThreadProcessId( hWnd, NULL );
2552
2553             if (tid == GetCurrentThreadId()) strcpy( taskName, "self" );
2554             else sprintf( taskName, "tid %04x", GetCurrentThreadId() );
2555
2556             if (iFlag == SPY_SENDMESSAGE16)
2557                 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04lx lp=%08lx\n",
2558                       indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,
2559                       sp_e.msg_name, taskName, wParam, lParam );
2560             else
2561             {   TRACE("%*s(%p) %-16s message [%04x] %s sent from %s wp=%08lx lp=%08lx\n",
2562                              indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2563                              sp_e.msg_name, taskName, wParam, lParam );
2564                 SPY_DumpStructure(&sp_e, TRUE);
2565             }
2566         }
2567         break;
2568
2569     case SPY_DEFWNDPROC16:
2570         if( SPY_ExcludeDWP ) return;
2571         TRACE("%*s(%04x)  DefWindowProc16: %s [%04x]  wp=%04lx lp=%08lx\n",
2572               indent, "", HWND_16(hWnd), sp_e.msg_name, msg, wParam, lParam );
2573         break;
2574
2575     case SPY_DEFWNDPROC:
2576         if( SPY_ExcludeDWP ) return;
2577         TRACE("%*s(%p)  DefWindowProc32: %s [%04x]  wp=%08lx lp=%08lx\n",
2578                         indent, "", hWnd, sp_e.msg_name,
2579                         msg, wParam, lParam );
2580         break;
2581     }
2582     set_indent_level( indent + SPY_INDENT_UNIT );
2583 }
2584
2585
2586 /***********************************************************************
2587  *           SPY_ExitMessage
2588  */
2589 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2590                        WPARAM wParam, LPARAM lParam )
2591 {
2592     SPY_INSTANCE sp_e;
2593     int indent;
2594
2595     if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2596         (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
2597         return;
2598
2599     sp_e.msgnum = msg;
2600     sp_e.msg_hwnd   = hWnd;
2601     sp_e.lParam = lParam;
2602     sp_e.wParam = wParam;
2603     SPY_GetWndName(&sp_e);
2604     SPY_GetMsgStuff(&sp_e);
2605
2606     if ((indent = get_indent_level()))
2607     {
2608         indent -= SPY_INDENT_UNIT;
2609         set_indent_level( indent );
2610     }
2611
2612     switch(iFlag)
2613     {
2614     case SPY_RESULT_DEFWND16:
2615         TRACE(" %*s(%04x)  DefWindowProc16: %s [%04x] returned %08lx\n",
2616               indent, "", HWND_16(hWnd), sp_e.msg_name, msg, lReturn );
2617         break;
2618
2619     case SPY_RESULT_DEFWND:
2620         TRACE(" %*s(%p)  DefWindowProc32: %s [%04x] returned %08lx\n",
2621                         indent, "", hWnd, sp_e.msg_name, msg, lReturn );
2622         break;
2623
2624     case SPY_RESULT_OK16:
2625         TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
2626               indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg,
2627               sp_e.msg_name, lReturn );
2628         break;
2629
2630     case SPY_RESULT_OK:
2631         TRACE(" %*s(%p) %-16s message [%04x] %s returned %08lx\n",
2632                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2633                         sp_e.msg_name, lReturn );
2634         SPY_DumpStructure(&sp_e, FALSE);
2635         break;
2636
2637     case SPY_RESULT_INVALIDHWND16:
2638         WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
2639              indent, "", HWND_16(hWnd), debugstr_w(sp_e.wnd_name), msg, sp_e.msg_name );
2640         break;
2641
2642     case SPY_RESULT_INVALIDHWND:
2643         WARN(" %*s(%p) %-16s message [%04x] %s HAS INVALID HWND\n",
2644                         indent, "", hWnd, debugstr_w(sp_e.wnd_name), msg,
2645                         sp_e.msg_name );
2646         break;
2647    }
2648 }
2649
2650
2651 /***********************************************************************
2652  *           SPY_Init
2653  */
2654 int SPY_Init(void)
2655 {
2656     int i, j;
2657     char buffer[1024];
2658     const SPY_NOTIFY *p;
2659     const USER_MSG *q;
2660     HKEY hkey;
2661
2662     if (!TRACE_ON(message)) return TRUE;
2663
2664     indent_tls_index = TlsAlloc();
2665     /* @@ Wine registry key: HKCU\Software\Wine\Debug */
2666     if(!RegOpenKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Debug", &hkey))
2667     {
2668         DWORD type, count = sizeof(buffer);
2669
2670         buffer[0] = 0;
2671         if (!RegQueryValueExA(hkey, "SpyInclude", 0, &type, (LPBYTE) buffer, &count) &&
2672             strcmp( buffer, "INCLUDEALL" ))
2673         {
2674             TRACE("Include=%s\n", buffer );
2675             for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2676                 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2677         }
2678
2679         count = sizeof(buffer);
2680         buffer[0] = 0;
2681         if (!RegQueryValueExA(hkey, "SpyExclude", 0, &type, (LPBYTE) buffer, &count))
2682         {
2683             TRACE("Exclude=%s\n", buffer );
2684             if (!strcmp( buffer, "EXCLUDEALL" ))
2685                 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2686             else
2687                 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2688                     SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2689         }
2690
2691         SPY_ExcludeDWP = 0;
2692         count = sizeof(buffer);
2693         if(!RegQueryValueExA(hkey, "SpyExcludeDWP", 0, &type, (LPBYTE) buffer, &count))
2694             SPY_ExcludeDWP = atoi(buffer);
2695
2696         RegCloseKey(hkey);
2697     }
2698
2699     /* find last good entry in spy notify array and save addr for b-search */
2700     p = &spnfy_array[0];
2701     j = 0xffffffff;
2702     while (p->name) {
2703         if ((UINT)p->value > (UINT)j) {
2704             ERR("Notify message array out of order\n");
2705             ERR("  between values [%08x] %s and [%08x] %s\n",
2706                 j, (p-1)->name, p->value, p->name);
2707             break;
2708         }
2709         j = p->value;
2710         p++;
2711     }
2712     p--;
2713     end_spnfy_array = p;
2714
2715     /* find last good entry in each common control message array
2716      *  and save addr for b-search.
2717      */
2718     i = 0;
2719     while (cc_array[i].classname) {
2720
2721         j = 0x0400; /* minimum entry in array */
2722         q = cc_array[i].classmsg;
2723         while(q->name) {
2724             if (q->value <= j) {
2725                 ERR("Class message array out of order for class %s\n",
2726                     debugstr_w(cc_array[i].classname));
2727                 ERR("  between values [%04x] %s and [%04x] %s\n",
2728                     j, (q-1)->name, q->value, q->name);
2729                 break;
2730             }
2731             j = q->value;
2732             q++;
2733         }
2734         q--;
2735         cc_array[i].lastmsg = q;
2736
2737         i++;
2738     }
2739
2740     return 1;
2741 }