2 * Message spying routines
4 * Copyright 1994, Bob Amstadt
14 #include "wine/winuser16.h"
15 #include "wine/winbase16.h"
17 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(message);
23 #define SPY_MAX_MSGNUM WM_USER
24 #define SPY_INDENT_UNIT 4 /* 4 spaces */
26 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
44 "WM_CLOSE", /* 0x10 */
60 "WM_SETCURSOR", /* 0x20 */
76 "WM_SETFONT", /* 0x30 */
88 "wm_otherwindowcreated",
89 "wm_otherwindowdestroyed",
90 "wm_activateshellwindow",
94 "wm_compacting", NULL, NULL,
95 "WM_COMMNOTIFY", NULL,
96 "WM_WINDOWPOSCHANGING", /* 0x0046 */
97 "WM_WINDOWPOSCHANGED", /* 0x0047 */
100 "WM_CANCELJOURNAL", NULL, NULL,
104 "WM_INPUTLANGCHANGEREQUEST",
105 "WM_INPUTLANGCHANGE",
109 "WM_NOTIFYFORMAT", NULL, NULL,
110 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
113 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
114 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
117 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
125 "WM_SETICON", /* 0x0080 */
126 "WM_NCCREATE", /* 0x0081 */
127 "WM_NCDESTROY", /* 0x0082 */
128 "WM_NCCALCSIZE", /* 0x0083 */
129 "WM_NCHITTEST", /* 0x0084 */
130 "WM_NCPAINT", /* 0x0085 */
131 "WM_NCACTIVATE", /* 0x0086 */
132 "WM_GETDLGCODE", /* 0x0087 */
134 "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
137 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
138 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
141 "WM_NCMOUSEMOVE", /* 0x00A0 */
142 "WM_NCLBUTTONDOWN", /* 0x00A1 */
143 "WM_NCLBUTTONUP", /* 0x00A2 */
144 "WM_NCLBUTTONDBLCLK", /* 0x00A3 */
145 "WM_NCRBUTTONDOWN", /* 0x00A4 */
146 "WM_NCRBUTTONUP", /* 0x00A5 */
147 "WM_NCRBUTTONDBLCLK", /* 0x00A6 */
148 "WM_NCMBUTTONDOWN", /* 0x00A7 */
149 "WM_NCMBUTTONUP", /* 0x00A8 */
150 "WM_NCMBUTTONDBLCLK", /* 0x00A9 */
151 NULL, NULL, NULL, NULL, NULL, NULL,
153 /* 0x00B0 - Win32 Edit controls */
154 "EM_GETSEL", /* 0x00b0 */
155 "EM_SETSEL", /* 0x00b1 */
156 "EM_GETRECT", /* 0x00b2 */
157 "EM_SETRECT", /* 0x00b3 */
158 "EM_SETRECTNP", /* 0x00b4 */
159 "EM_SCROLL", /* 0x00b5 */
160 "EM_LINESCROLL", /* 0x00b6 */
161 "EM_SCROLLCARET", /* 0x00b7 */
162 "EM_GETMODIFY", /* 0x00b8 */
163 "EM_SETMODIFY", /* 0x00b9 */
164 "EM_GETLINECOUNT", /* 0x00ba */
165 "EM_LINEINDEX", /* 0x00bb */
166 "EM_SETHANDLE", /* 0x00bc */
167 "EM_GETHANDLE", /* 0x00bd */
168 "EM_GETTHUMB", /* 0x00be */
172 "EM_LINELENGTH", /* 0x00c1 */
173 "EM_REPLACESEL", /* 0x00c2 */
175 "EM_GETLINE", /* 0x00c4 */
176 "EM_LIMITTEXT", /* 0x00c5 */
177 "EM_CANUNDO", /* 0x00c6 */
178 "EM_UNDO", /* 0x00c7 */
179 "EM_FMTLINES", /* 0x00c8 */
180 "EM_LINEFROMCHAR", /* 0x00c9 */
182 "EM_SETTABSTOPS", /* 0x00cb */
183 "EM_SETPASSWORDCHAR", /* 0x00cc */
184 "EM_EMPTYUNDOBUFFER", /* 0x00cd */
185 "EM_GETFIRSTVISIBLELINE", /* 0x00ce */
186 "EM_SETREADONLY", /* 0x00cf */
188 "EM_SETWORDBREAKPROC", /* 0x00d0 */
189 "EM_GETWORDBREAKPROC", /* 0x00d1 */
190 "EM_GETPASSWORDCHAR", /* 0x00d2 */
191 "EM_SETMARGINS", /* 0x00d3 */
192 "EM_GETMARGINS", /* 0x00d4 */
193 "EM_GETLIMITTEXT", /* 0x00d5 */
194 "EM_POSFROMCHAR", /* 0x00d6 */
195 "EM_CHARFROMPOS", /* 0x00d7 */
196 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
198 /* 0x00E0 - Win32 Scrollbars */
199 "SBM_SETPOS", /* 0x00e0 */
200 "SBM_GETPOS", /* 0x00e1 */
201 "SBM_SETRANGE", /* 0x00e2 */
202 "SBM_GETRANGE", /* 0x00e3 */
203 "SBM_ENABLE_ARROWS", /* 0x00e4 */
205 "SBM_SETRANGEREDRAW", /* 0x00e6 */
207 "SBM_SETSCROLLINFO", /* 0x00e9 */
208 "SBM_GETSCROLLINFO", /* 0x00ea */
209 NULL, NULL, NULL, NULL, NULL,
211 /* 0x00F0 - Win32 Buttons */
212 "BM_GETCHECK", /* 0x00f0 */
213 "BM_SETCHECK", /* 0x00f1 */
214 "BM_GETSTATE", /* 0x00f2 */
215 "BM_SETSTATE", /* 0x00f3 */
216 "BM_SETSTYLE", /* 0x00f4 */
217 "BM_CLICK", /* 0x00f5 */
218 "BM_GETIMAGE", /* 0x00f6 */
219 "BM_SETIMAGE", /* 0x00f7 */
220 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
222 "WM_KEYDOWN", /* 0x0100 */
223 "WM_KEYUP", /* 0x0101 */
224 "WM_CHAR", /* 0x0102 */
225 "WM_DEADCHAR", /* 0x0103 */
226 "WM_SYSKEYDOWN", /* 0x0104 */
227 "WM_SYSKEYUP", /* 0x0105 */
228 "WM_SYSCHAR", /* 0x0106 */
229 "WM_SYSDEADCHAR", /* 0x0107 */
230 "WM_KEYLAST", /* 0x0108 */
235 "WM_IME_STARTCOMPOSITION", /* 0x010d */
236 "WM_IME_ENDCOMPOSITION", /* 0x010e */
237 "WM_IME_COMPOSITION", /* 0x010f */
239 "WM_INITDIALOG", /* 0x0110 */
240 "WM_COMMAND", /* 0x0111 */
241 "WM_SYSCOMMAND", /* 0x0112 */
242 "WM_TIMER", /* 0x0113 */
243 "WM_HSCROLL", /* 0x0114 */
244 "WM_VSCROLL", /* 0x0115 */
245 "WM_INITMENU", /* 0x0116 */
246 "WM_INITMENUPOPUP", /* 0x0117 */
247 "WM_SYSTIMER", /* 0x0118 */
248 NULL, NULL, NULL, NULL, NULL, NULL,
249 "WM_MENUSELECT", /* 0x011f */
251 "WM_MENUCHAR", /* 0x0120 */
252 "WM_ENTERIDLE", /* 0x0121 */
253 NULL, NULL, NULL, NULL, NULL, NULL,
254 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
258 "WM_LBTRACKPOINT", /* 0x0131 */
259 "WM_CTLCOLORMSGBOX", /* 0x0132 */
260 "WM_CTLCOLOREDIT", /* 0x0133 */
261 "WM_CTLCOLORLISTBOX", /* 0x0134 */
262 "WM_CTLCOLORBTN", /* 0x0135 */
263 "WM_CTLCOLORDLG", /* 0x0136 */
264 "WM_CTLCOLORSCROLLBAR", /* 0x0137 */
265 "WM_CTLCOLORSTATIC", /* 0x0138 */
266 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
268 /* 0x0140 - Win32 Comboboxes */
269 "CB_GETEDITSEL", /* 0x0140 */
270 "CB_LIMITTEXT", /* 0x0141 */
271 "CB_SETEDITSEL", /* 0x0142 */
272 "CB_ADDSTRING", /* 0x0143 */
273 "CB_DELETESTRING", /* 0x0144 */
274 "CB_DIR", /* 0x0145 */
275 "CB_GETCOUNT", /* 0x0146 */
276 "CB_GETCURSEL", /* 0x0147 */
277 "CB_GETLBTEXT", /* 0x0148 */
278 "CB_GETLBTEXTLEN", /* 0x0149 */
279 "CB_INSERTSTRING", /* 0x014a */
280 "CB_RESETCONTENT", /* 0x014b */
281 "CB_FINDSTRING", /* 0x014c */
282 "CB_SELECTSTRING", /* 0x014d */
283 "CB_SETCURSEL", /* 0x014e */
284 "CB_SHOWDROPDOWN", /* 0x014f */
286 "CB_GETITEMDATA", /* 0x0150 */
287 "CB_SETITEMDATA", /* 0x0151 */
288 "CB_GETDROPPEDCONTROLRECT", /* 0x0152 */
289 "CB_SETITEMHEIGHT", /* 0x0153 */
290 "CB_GETITEMHEIGHT", /* 0x0154 */
291 "CB_SETEXTENDEDUI", /* 0x0155 */
292 "CB_GETEXTENDEDUI", /* 0x0156 */
293 "CB_GETDROPPEDSTATE", /* 0x0157 */
294 "CB_FINDSTRINGEXACT", /* 0x0158 */
295 "CB_SETLOCALE", /* 0x0159 */
296 "CB_GETLOCALE", /* 0x015a */
297 "CB_GETTOPINDEX", /* 0x015b */
298 "CB_SETTOPINDEX", /* 0x015c */
299 "CB_GETHORIZONTALEXTENT", /* 0x015d */
300 "CB_SETHORIZONTALEXTENT", /* 0x015e */
301 "CB_GETDROPPEDWIDTH", /* 0x015f */
303 "CB_SETDROPPEDWIDTH", /* 0x0160 */
304 "CB_INITSTORAGE", /* 0x0161 */
305 NULL, NULL, NULL, NULL, NULL, NULL,
306 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
308 /* 0x0170 - Win32 Static controls */
309 "STM_SETICON", /* 0x0170 */
310 "STM_GETICON", /* 0x0171 */
311 "STM_SETIMAGE", /* 0x0172 */
312 "STM_GETIMAGE", /* 0x0173 */
313 NULL, NULL, NULL, NULL,
314 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
316 /* 0x0180 - Win32 Listboxes */
317 "LB_ADDSTRING", /* 0x0180 */
318 "LB_INSERTSTRING", /* 0x0181 */
319 "LB_DELETESTRING", /* 0x0182 */
320 "LB_SELITEMRANGEEX", /* 0x0183 */
321 "LB_RESETCONTENT", /* 0x0184 */
322 "LB_SETSEL", /* 0x0185 */
323 "LB_SETCURSEL", /* 0x0186 */
324 "LB_GETSEL", /* 0x0187 */
325 "LB_GETCURSEL", /* 0x0188 */
326 "LB_GETTEXT", /* 0x0189 */
327 "LB_GETTEXTLEN", /* 0x018a */
328 "LB_GETCOUNT", /* 0x018b */
329 "LB_SELECTSTRING", /* 0x018c */
330 "LB_DIR", /* 0x018d */
331 "LB_GETTOPINDEX", /* 0x018e */
332 "LB_FINDSTRING", /* 0x018f */
334 "LB_GETSELCOUNT", /* 0x0190 */
335 "LB_GETSELITEMS", /* 0x0191 */
336 "LB_SETTABSTOPS", /* 0x0192 */
337 "LB_GETHORIZONTALEXTENT", /* 0x0193 */
338 "LB_SETHORIZONTALEXTENT", /* 0x0194 */
339 "LB_SETCOLUMNWIDTH", /* 0x0195 */
340 "LB_ADDFILE", /* 0x0196 */
341 "LB_SETTOPINDEX", /* 0x0197 */
342 "LB_GETITEMRECT", /* 0x0198 */
343 "LB_GETITEMDATA", /* 0x0199 */
344 "LB_SETITEMDATA", /* 0x019a */
345 "LB_SELITEMRANGE", /* 0x019b */
346 "LB_SETANCHORINDEX", /* 0x019c */
347 "LB_GETANCHORINDEX", /* 0x019d */
348 "LB_SETCARETINDEX", /* 0x019e */
349 "LB_GETCARETINDEX", /* 0x019f */
351 "LB_SETITEMHEIGHT", /* 0x01a0 */
352 "LB_GETITEMHEIGHT", /* 0x01a1 */
353 "LB_FINDSTRINGEXACT", /* 0x01a2 */
354 "LB_CARETON", /* 0x01a3 */
355 "LB_CARETOFF", /* 0x01a4 */
356 "LB_SETLOCALE", /* 0x01a5 */
357 "LB_GETLOCALE", /* 0x01a6 */
358 "LB_SETCOUNT", /* 0x01a7 */
359 "LB_INITSTORAGE", /* 0x01a8 */
360 "LB_ITEMFROMPOINT", /* 0x01a9 */
361 NULL, NULL, NULL, NULL, NULL, NULL,
364 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
365 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
368 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
369 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
372 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
373 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
376 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
377 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
380 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
381 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
383 "WM_MOUSEMOVE", /* 0x0200 */
384 "WM_LBUTTONDOWN", /* 0x0201 */
385 "WM_LBUTTONUP", /* 0x0202 */
386 "WM_LBUTTONDBLCLK", /* 0x0203 */
387 "WM_RBUTTONDOWN", /* 0x0204 */
388 "WM_RBUTTONUP", /* 0x0205 */
389 "WM_RBUTTONDBLCLK", /* 0x0206 */
390 "WM_MBUTTONDOWN", /* 0x0207 */
391 "WM_MBUTTONUP", /* 0x0208 */
392 "WM_MBUTTONDBLCLK", /* 0x0209 */
393 "WM_MOUSEWHEEL", /* 0x020A */
394 NULL, NULL, NULL, NULL, NULL,
396 "WM_PARENTNOTIFY", /* 0x0210 */
397 "WM_ENTERMENULOOP", /* 0x0211 */
398 "WM_EXITMENULOOP", /* 0x0212 */
399 "WM_NEXTMENU", /* 0x0213 */
404 "WM_DEVICECHANGE", NULL, NULL, NULL, NULL, NULL, NULL,
406 "WM_MDICREATE", /* 0x0220 */
407 "WM_MDIDESTROY", /* 0x0221 */
408 "WM_MDIACTIVATE", /* 0x0222 */
409 "WM_MDIRESTORE", /* 0x0223 */
410 "WM_MDINEXT", /* 0x0224 */
411 "WM_MDIMAXIMIZE", /* 0x0225 */
412 "WM_MDITILE", /* 0x0226 */
413 "WM_MDICASCADE", /* 0x0227 */
414 "WM_MDIICONARRANGE", /* 0x0228 */
415 "WM_MDIGETACTIVE", /* 0x0229 */
418 "WM_QUERYDROPOBJECT",
425 "WM_MDISETMENU", /* 0x0230 */
426 "WM_ENTERSIZEMOVE", /* 0x0231 */
427 "WM_EXITSIZEMOVE", /* 0x0232 */
428 "WM_DROPFILES", /* 0x0233 */
429 "WM_MDIREFRESHMENU", NULL, NULL, NULL,
431 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
434 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
435 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
438 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
439 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
442 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
443 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
444 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
445 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
448 NULL, "WM_IME_SETCONTEXT", "WM_IME_NOTIFY", "WM_IME_CONTROL", "WM_IME_COMPOSITIONFULL", "WM_IME_SELECT", "WM_IME_CHAR", NULL,
449 "WM_IME_REQUEST", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
450 "WM_IME_KEYDOWN", "WM_IME_KEYUP", NULL, NULL, NULL, NULL, NULL, NULL,
451 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
454 NULL, "WM_MOUSEHOVER", NULL, "WM_MOUSELEAVE", NULL, NULL, NULL, NULL,
455 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
456 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
457 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
460 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
461 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
462 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
463 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
465 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
466 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
467 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
468 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
470 "WM_CUT", /* 0x0300 */
476 "WM_RENDERALLFORMATS",
477 "WM_DESTROYCLIPBOARD",
480 "WM_VSCROLLCLIPBOARD",
482 "WM_ASKCBFORMATNAME",
484 "WM_HSCROLLCLIPBOARD",
485 "WM_QUERYNEWPALETTE", /* 0x030f*/
487 "WM_PALETTEISCHANGING",
489 "WM_HOTKEY", /* 0x0312 */
490 NULL, NULL, NULL, NULL,
493 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
495 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
496 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
497 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
498 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
501 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
502 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
503 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
504 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
506 "WM_QUERYAFXWNDPROC", /* 0x0360 */
507 "WM_SIZEPARENT", /* 0x0361 */
508 "WM_SETMESSAGESTRING", /* 0x0362 */
509 "WM_IDLEUPDATECMDUI", /* 0x0363 */
510 "WM_INITIALUPDATE", /* 0x0364 */
511 "WM_COMMANDHELP", /* 0x0365 */
512 "WM_HELPHITTEST", /* 0x0366 */
513 "WM_EXITHELPMODE", /* 0x0367 */
514 "WM_RECALCPARENT", /* 0x0368 */
515 "WM_SIZECHILD", /* 0x0369 */
516 "WM_KICKIDLE", /* 0x036A */
517 "WM_QUERYCENTERWND", /* 0x036B */
518 "WM_DISABLEMODAL", /* 0x036C */
519 "WM_FLOATSTATUS", /* 0x036D */
520 "WM_ACTIVATETOPLEVEL", /* 0x036E */
521 "WM_QUERY3DCONTROLS", /* 0x036F */
523 "WM_SOCKET_NOTIFY", /* 0x0373 */
524 "WM_SOCKET_DEAD", /* 0x0374 */
525 "WM_POPMESSAGESTRING", /* 0x0375 */
526 "WM_OCC_LOADFROMSTREAM", /* 0x0376 */
527 "WM_OCC_LOADFROMSTORAGE", /* 0x0377 */
528 "WM_OCC_INITNEW", /* 0x0378 */
529 "WM_QUEUE_SENTINEL", /* 0x0379 */
530 "WM_OCC_LOADFROMSTREAM_EX", /* 0x037A */
531 "WM_OCC_LOADFROMSTORAGE_EX", /* 0x037B */
535 "WM_PENWINFIRST", /* 0x0380 */
536 "WM_RCRESULT", /* 0x0381 */
537 "WM_HOOKRCRESULT", /* 0x0382 */
538 "WM_GLOBALRCCHANGE", /* 0x0383 */
539 "WM_SKB", /* 0x0384 */
540 "WM_HEDITCTL", /* 0x0385 */
542 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
543 "WM_PENWINLAST", /* 0x038F */
545 "WM_COALESCE_FIRST", /* 0x0390 */
546 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
547 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
548 "WM_COALESCE_LAST", /* 0x039F */
555 NULL, NULL, NULL, NULL,
556 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
559 NULL, NULL, NULL, NULL, NULL,
583 NULL, NULL, NULL, NULL, NULL, NULL,
584 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
585 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
588 "WM_DDE_INITIATE", /* 0x3E0 */
589 "WM_DDE_TERMINATE", /* 0x3E1 */
590 "WM_DDE_ADVISE", /* 0x3E2 */
591 "WM_DDE_UNADVISE", /* 0x3E3 */
592 "WM_DDE_ACK", /* 0x3E4 */
593 "WM_DDE_DATA", /* 0x3E5 */
594 "WM_DDE_REQUEST", /* 0x3E6 */
595 "WM_DDE_POKE", /* 0x3E7 */
596 "WM_DDE_EXECUTE", /* 0x3E8 */
597 NULL, NULL, NULL, NULL, NULL, NULL, NULL,
601 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
602 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
604 "WM_USER" /* 0x0400 */
608 #define SPY_MAX_LVMMSGNUM 140
609 static const char * const LVMMessageTypeNames[SPY_MAX_LVMMSGNUM + 1] =
611 "LVM_GETBKCOLOR", /* 1000 */
620 "LVM_DELETEALLITEMS",
621 "LVM_GETCALLBACKMASK",
622 "LVM_SETCALLBACKMASK",
626 "LVM_SETITEMPOSITION",
627 "LVM_GETITEMPOSITION",
628 "LVM_GETSTRINGWIDTHA",
635 "LVM_GETEDITCONTROL",
640 "LVM_GETCOLUMNWIDTH",
641 "LVM_SETCOLUMNWIDTH",
644 "LVM_CREATEDRAGIMAGE",
648 "LVM_GETTEXTBKCOLOR",
649 "LVM_SETTEXTBKCOLOR",
651 "LVM_GETCOUNTPERPAGE",
660 "LVM_SETITEMPOSITION32",
661 "LVM_GETSELECTEDCOUNT",
662 "LVM_GETITEMSPACING",
663 "LVM_GETISEARCHSTRINGA",
664 "LVM_SETICONSPACING",
665 "LVM_SETEXTENDEDLISTVIEWSTYLE",
666 "LVM_GETEXTENDEDLISTVIEWSTYLE",
667 "LVM_GETSUBITEMRECT",
668 "LVM_SUBITEMHITTEST",
669 "LVM_SETCOLUMNORDERARRAY",
670 "LVM_GETCOLUMNORDERARRAY",
675 "LVM_APPROXIMATEVIEWRECT",
677 "LVM_GETSELECTIONMARK",
678 "LVM_SETSELECTIONMARK",
684 "LVM_GETNUMBEROFWORKAREAS",
698 "LVM_GETSTRINGWIDTHW",
728 "LVM_GETISEARCHSTRINGW",
751 "LVM_GETBKIMAGEW" /* 0x108B */
755 #define SPY_MAX_TVMSGNUM 65
756 static const char * const TVMessageTypeNames[SPY_MAX_TVMSGNUM + 1] =
758 "TVM_INSERTITEMA", /* 1100 */
773 "TVM_GETEDITCONTROL",
774 "TVM_GETVISIBLECOUNT",
776 "TVM_CREATEDRAGIMAGE",
779 "TVM_SORTCHILDRENCB",
780 "TVM_ENDEDITLABELNOW",
781 "TVM_GETISEARCHSTRINGA",
795 "TVM_SETINSERTMARKCOLOR",
796 "TVM_GETINSERTMARKCOLOR",
822 "TVM_GETISEARCHSTRINGW",
827 #define SPY_MAX_HDMMSGNUM 19
828 static const char * const HDMMessageTypeNames[SPY_MAX_HDMMSGNUM + 1] =
830 "HDM_GETITEMCOUNT", /* 1200 */
846 "HDM_CREATEDRAGIMAGE",
847 "GETORDERARRAYINDEX",
848 "SETORDERARRAYINDEX",
853 #define SPY_MAX_TCMMSGNUM 62
854 static const char * const TCMMessageTypeNames[SPY_MAX_TCMMSGNUM + 1] =
865 "TCM_DELETEALLITEMS",
905 "TCM_SETMINTABWIDTH",
908 "TCM_SETEXTENDEDSTYLE",
909 "TCM_GETEXTENDEDSTYLE",
921 #define SPY_MAX_PGMMSGNUM 13
922 static const char * const PGMMessageTypeNames[SPY_MAX_PGMMSGNUM + 1] =
936 "PGM_GETBUTTONSTATE",
941 #define SPY_MAX_CCMMSGNUM 6
942 static const char * const CCMMessageTypeNames[SPY_MAX_CCMMSGNUM + 1] =
946 "CCM_SETCOLORSCHEME",
947 "CCM_GETCOLORSCHEME",
949 "CCM_SETUNICODEFORMAT",
950 "CCM_GETUNICODEFORMAT"
953 /* Virtual key names */
954 #define SPY_MAX_VKKEYSNUM 255
955 static const char * const VK_KeyNames[SPY_MAX_VKKEYSNUM + 1] =
958 "VK_LBUTTON", /* 0x01 */
959 "VK_RBUTTON", /* 0x02 */
960 "VK_CANCEL", /* 0x03 */
961 "VK_MBUTTON", /* 0x04 */
965 "VK_BACK", /* 0x08 */
969 "VK_CLEAR", /* 0x0C */
970 "VK_RETURN", /* 0x0D */
973 "VK_SHIFT", /* 0x10 */
974 "VK_CONTROL", /* 0x11 */
975 "VK_MENU", /* 0x12 */
976 "VK_PAUSE", /* 0x13 */
977 "VK_CAPITAL", /* 0x14 */
984 "VK_ESCAPE", /* 0x1B */
989 "VK_SPACE", /* 0x20 */
990 "VK_PRIOR", /* 0x21 */
991 "VK_NEXT", /* 0x22 */
993 "VK_HOME", /* 0x24 */
994 "VK_LEFT", /* 0x25 */
996 "VK_RIGHT", /* 0x27 */
997 "VK_DOWN", /* 0x28 */
998 "VK_SELECT", /* 0x29 */
999 "VK_PRINT", /* 0x2A */
1000 "VK_EXECUTE", /* 0x2B */
1001 "VK_SNAPSHOT", /* 0x2C */
1002 "VK_INSERT", /* 0x2D */
1003 "VK_DELETE", /* 0x2E */
1004 "VK_HELP", /* 0x2F */
1048 "VK_LWIN", /* 0x5B */
1049 "VK_RWIN", /* 0x5C */
1050 "VK_APPS", /* 0x5D */
1053 "VK_NUMPAD0", /* 0x60 */
1054 "VK_NUMPAD1", /* 0x61 */
1055 "VK_NUMPAD2", /* 0x62 */
1056 "VK_NUMPAD3", /* 0x63 */
1057 "VK_NUMPAD4", /* 0x64 */
1058 "VK_NUMPAD5", /* 0x65 */
1059 "VK_NUMPAD6", /* 0x66 */
1060 "VK_NUMPAD7", /* 0x67 */
1061 "VK_NUMPAD8", /* 0x68 */
1062 "VK_NUMPAD9", /* 0x69 */
1063 "VK_MULTIPLY", /* 0x6A */
1064 "VK_ADD", /* 0x6B */
1065 "VK_SEPARATOR", /* 0x6C */
1066 "VK_SUBTRACT", /* 0x6D */
1067 "VK_DECIMAL", /* 0x6E */
1068 "VK_DIVIDE", /* 0x6F */
1078 "VK_F10", /* 0x79 */
1079 "VK_F11", /* 0x7A */
1080 "VK_F12", /* 0x7B */
1081 "VK_F13", /* 0x7C */
1082 "VK_F14", /* 0x7D */
1083 "VK_F15", /* 0x7E */
1084 "VK_F16", /* 0x7F */
1085 "VK_F17", /* 0x80 */
1086 "VK_F18", /* 0x81 */
1087 "VK_F19", /* 0x82 */
1088 "VK_F20", /* 0x83 */
1089 "VK_F21", /* 0x84 */
1090 "VK_F22", /* 0x85 */
1091 "VK_F23", /* 0x86 */
1092 "VK_F24", /* 0x87 */
1101 "VK_NUMLOCK", /* 0x90 */
1102 "VK_SCROLL", /* 0x91 */
1117 "VK_LSHIFT", /* 0xA0 */
1118 "VK_RSHIFT", /* 0xA1 */
1119 "VK_LCONTROL", /* 0xA2 */
1120 "VK_RCONTROL", /* 0xA3 */
1121 "VK_LMENU", /* 0xA4 */
1122 "VK_RMENU", /* 0xA5 */
1143 "VK_OEM_1", /* 0xBA */
1144 "VK_OEM_PLUS", /* 0xBB */
1145 "VK_OEM_COMMA", /* 0xBC */
1146 "VK_OEM_MINUS", /* 0xBD */
1147 "VK_OEM_PERIOD", /* 0xBE */
1148 "VK_OEM_2", /* 0xBF */
1149 "VK_OEM_3", /* 0xC0 */
1176 "VK_OEM_4", /* 0xDB */
1177 "VK_OEM_5", /* 0xDC */
1178 "VK_OEM_6", /* 0xDD */
1179 "VK_OEM_7", /* 0xDE */
1180 "VK_OEM_8", /* 0xDF */
1182 "VK_OEM_AX", /* 0xE1 */
1183 "VK_OEM_102", /* 0xE2 */
1184 "VK_ICO_HELP", /* 0xE3 */
1185 "VK_ICO_00", /* 0xE4 */
1186 "VK_PROCESSKEY", /* 0xE5 */
1203 "VK_ATTN", /* 0xF6 */
1204 "VK_CRSEL", /* 0xF7 */
1205 "VK_EXSEL", /* 0xF8 */
1206 "VK_EREOF", /* 0xF9 */
1207 "VK_PLAY", /* 0xFA */
1208 "VK_ZOOM", /* 0xFB */
1209 "VK_NONAME", /* 0xFC */
1210 "VK_PA1", /* 0xFD */
1211 "VK_OEM_CLEAR", /* 0xFE */
1216 /************************************************************************/
1219 /* WM_USER+n message values for "common controls" */
1223 const char *name; /* name of control message */
1224 UINT value; /* message number (0x0401-0x0fff */
1225 UINT len; /* length of space at lParam to dump */
1231 CHAR *classname; /* class name to match */
1232 const USER_MSG *classmsg; /* pointer to first USER_MSG for class */
1233 USER_MSG *lastmsg; /* pointer to last USER_MSG for class */
1236 #define USM(a,b) { #a ,a,b}
1237 #define SZOF(a) sizeof(a)
1239 /* To dump memory at the lParam for any of these messages, */
1240 /* replace the "0" with a "SZOF(structure)", or with a */
1241 /* number. (First method prefered.) */
1243 static const USER_MSG rebar_array[] = {
1244 USM(RB_INSERTBANDA, 0),
1245 USM(RB_DELETEBAND, 0),
1246 USM(RB_GETBARINFO, 0),
1247 USM(RB_SETBARINFO, 0),
1248 USM(RB_GETBANDINFO, 0),
1249 USM(RB_SETBANDINFOA, 0),
1250 USM(RB_SETPARENT, 0),
1253 USM(RB_INSERTBANDW, 0),
1254 USM(RB_SETBANDINFOW, 0),
1255 USM(RB_GETBANDCOUNT, 0),
1256 USM(RB_GETROWCOUNT, 0),
1257 USM(RB_GETROWHEIGHT, 0),
1258 USM(RB_IDTOINDEX, 0),
1259 USM(RB_GETTOOLTIPS, 0),
1260 USM(RB_SETTOOLTIPS, 0),
1261 USM(RB_SETBKCOLOR, 0),
1262 USM(RB_GETBKCOLOR, 0),
1263 USM(RB_SETTEXTCOLOR, 0),
1264 USM(RB_GETTEXTCOLOR, 0),
1265 USM(RB_SIZETORECT, 0),
1266 USM(RB_BEGINDRAG, 0),
1268 USM(RB_DRAGMOVE, 0),
1269 USM(RB_GETBARHEIGHT, 0),
1270 USM(RB_GETBANDINFOW, 0),
1271 USM(RB_GETBANDINFOA, 0),
1272 USM(RB_MINIMIZEBAND, 0),
1273 USM(RB_MAXIMIZEBAND, 0),
1274 USM(RB_GETBANDBORDERS, 0),
1275 USM(RB_SHOWBAND, 0),
1276 USM(RB_SETPALETTE, 0),
1277 USM(RB_GETPALETTE, 0),
1278 USM(RB_MOVEBAND, 0),
1281 static const USER_MSG toolbar_array[] = {
1282 USM(TB_ENABLEBUTTON ,0),
1283 USM(TB_CHECKBUTTON ,0),
1284 USM(TB_PRESSBUTTON ,0),
1285 USM(TB_HIDEBUTTON ,0),
1286 USM(TB_INDETERMINATE ,0),
1287 USM(TB_MARKBUTTON ,0),
1288 USM(TB_ISBUTTONENABLED ,0),
1289 USM(TB_ISBUTTONCHECKED ,0),
1290 USM(TB_ISBUTTONPRESSED ,0),
1291 USM(TB_ISBUTTONHIDDEN ,0),
1292 USM(TB_ISBUTTONINDETERMINATE ,0),
1293 USM(TB_ISBUTTONHIGHLIGHTED ,0),
1294 USM(TB_SETSTATE ,0),
1295 USM(TB_GETSTATE ,0),
1296 USM(TB_ADDBITMAP ,0),
1297 USM(TB_ADDBUTTONSA ,0),
1298 USM(TB_INSERTBUTTONA ,0),
1299 USM(TB_DELETEBUTTON ,0),
1300 USM(TB_GETBUTTON ,0),
1301 USM(TB_BUTTONCOUNT ,0),
1302 USM(TB_COMMANDTOINDEX ,0),
1303 USM(TB_SAVERESTOREA ,0),
1304 USM(TB_CUSTOMIZE ,0),
1305 USM(TB_ADDSTRINGA ,0),
1306 USM(TB_GETITEMRECT ,0),
1307 USM(TB_BUTTONSTRUCTSIZE ,0),
1308 USM(TB_SETBUTTONSIZE ,0),
1309 USM(TB_SETBITMAPSIZE ,0),
1310 USM(TB_AUTOSIZE ,0),
1311 USM(TB_GETTOOLTIPS ,0),
1312 USM(TB_SETTOOLTIPS ,0),
1313 USM(TB_SETPARENT ,0),
1316 USM(TB_GETBITMAPFLAGS ,0),
1317 USM(TB_SETCMDID ,0),
1318 USM(TB_CHANGEBITMAP ,0),
1319 USM(TB_GETBITMAP ,0),
1320 USM(TB_GETBUTTONTEXTA ,0),
1321 USM(TB_REPLACEBITMAP ,0),
1322 USM(TB_SETINDENT ,0),
1323 USM(TB_SETIMAGELIST ,0),
1324 USM(TB_GETIMAGELIST ,0),
1325 USM(TB_LOADIMAGES ,0),
1327 USM(TB_SETHOTIMAGELIST ,0),
1328 USM(TB_GETHOTIMAGELIST ,0),
1329 USM(TB_SETDISABLEDIMAGELIST ,0),
1330 USM(TB_GETDISABLEDIMAGELIST ,0),
1331 USM(TB_SETSTYLE ,0),
1332 USM(TB_GETSTYLE ,0),
1333 USM(TB_GETBUTTONSIZE ,0),
1334 USM(TB_SETBUTTONWIDTH ,0),
1335 USM(TB_SETMAXTEXTROWS ,0),
1336 USM(TB_GETTEXTROWS ,0),
1337 USM(TB_GETOBJECT ,0),
1338 USM(TB_GETBUTTONINFOW ,0),
1339 USM(TB_SETBUTTONINFOW ,0),
1340 USM(TB_GETBUTTONINFOA ,0),
1341 USM(TB_SETBUTTONINFOA ,0),
1342 USM(TB_INSERTBUTTONW ,0),
1343 USM(TB_ADDBUTTONSW ,0),
1345 USM(TB_SETDRAWTEXTFLAGS ,0),
1346 USM(TB_GETHOTITEM ,0),
1347 USM(TB_SETHOTITEM ,0),
1348 USM(TB_SETANCHORHIGHLIGHT ,0),
1349 USM(TB_GETANCHORHIGHLIGHT ,0),
1350 USM(TB_GETBUTTONTEXTW ,0),
1351 USM(TB_SAVERESTOREW ,0),
1352 USM(TB_ADDSTRINGW ,0),
1353 USM(TB_MAPACCELERATORA ,0),
1354 USM(TB_GETINSERTMARK ,0),
1355 USM(TB_SETINSERTMARK ,0),
1356 USM(TB_INSERTMARKHITTEST ,0),
1357 USM(TB_MOVEBUTTON ,0),
1358 USM(TB_GETMAXSIZE ,0),
1359 USM(TB_SETEXTENDEDSTYLE ,0),
1360 USM(TB_GETEXTENDEDSTYLE ,0),
1361 USM(TB_GETPADDING ,0),
1362 USM(TB_SETPADDING ,0),
1363 USM(TB_SETINSERTMARKCOLOR ,0),
1364 USM(TB_GETINSERTMARKCOLOR ,0),
1365 USM(TB_MAPACCELERATORW ,0),
1368 static const USER_MSG comboex_array[] = {
1369 USM(CBEM_INSERTITEMA ,0),
1370 USM(CBEM_SETIMAGELIST ,0),
1371 USM(CBEM_GETIMAGELIST ,0),
1372 USM(CBEM_GETITEMA ,0),
1373 USM(CBEM_SETITEMA ,0),
1374 USM(CBEM_GETCOMBOCONTROL ,0),
1375 USM(CBEM_GETEDITCONTROL ,0),
1376 USM(CBEM_SETEXSTYLE ,0),
1377 USM(CBEM_GETEXTENDEDSTYLE ,0),
1378 USM(CBEM_HASEDITCHANGED ,0),
1379 USM(CBEM_INSERTITEMW ,0),
1380 USM(CBEM_SETITEMW ,0),
1381 USM(CBEM_GETITEMW ,0),
1382 USM(CBEM_SETEXTENDEDSTYLE ,0),
1388 static CONTROL_CLASS cc_array[] = {
1389 {WC_COMBOBOXEXA, comboex_array, 0},
1390 {REBARCLASSNAMEA, rebar_array, 0},
1391 {TOOLBARCLASSNAMEA, toolbar_array, 0},
1395 /************************************************************************/
1398 /* WM_NOTIFY function codes display */
1402 const char *name; /* name of notify message */
1403 UINT value; /* notify code value */
1404 UINT len; /* length of extra space to dump */
1407 #define SPNFY(a,b) { #a ,a,sizeof(b)-sizeof(NMHDR)}
1409 /* Array MUST be in descending order by the 'value' field */
1410 /* (since value is UNSIGNED, 0xffffffff is largest and */
1411 /* 0xfffffffe is smaller). A binary search is used to */
1412 /* locate the correct 'value'. */
1413 static const SPY_NOTIFY spnfy_array[] = {
1414 /* common 0U to 0U-99U */
1415 SPNFY(NM_OUTOFMEMORY, NMHDR),
1416 SPNFY(NM_CLICK, NMHDR),
1417 SPNFY(NM_DBLCLK, NMHDR),
1418 SPNFY(NM_RETURN, NMHDR),
1419 SPNFY(NM_RCLICK, NMHDR),
1420 SPNFY(NM_RDBLCLK, NMHDR),
1421 SPNFY(NM_SETFOCUS, NMHDR),
1422 SPNFY(NM_KILLFOCUS, NMHDR),
1423 SPNFY(NM_CUSTOMDRAW, NMCUSTOMDRAW),
1424 SPNFY(NM_HOVER, NMHDR),
1425 SPNFY(NM_NCHITTEST, NMMOUSE),
1426 SPNFY(NM_KEYDOWN, NMKEY),
1427 SPNFY(NM_RELEASEDCAPTURE, NMHDR),
1428 SPNFY(NM_SETCURSOR, NMMOUSE),
1429 SPNFY(NM_CHAR, NMCHAR),
1430 SPNFY(NM_TOOLTIPSCREATED, NMTOOLTIPSCREATED),
1431 /* Listview 0U-100U to 0U-199U */
1432 SPNFY(LVN_ITEMCHANGING, NMLISTVIEW),
1433 SPNFY(LVN_ITEMCHANGED, NMLISTVIEW),
1434 SPNFY(LVN_INSERTITEM, NMLISTVIEW),
1435 SPNFY(LVN_DELETEITEM, NMLISTVIEW),
1436 SPNFY(LVN_DELETEALLITEMS, NMLISTVIEW),
1437 SPNFY(LVN_BEGINLABELEDITA, NMLVDISPINFOA),
1438 SPNFY(LVN_ENDLABELEDITA, NMLVDISPINFOA),
1439 SPNFY(LVN_COLUMNCLICK, NMLISTVIEW),
1440 SPNFY(LVN_BEGINDRAG, NMLISTVIEW),
1441 SPNFY(LVN_BEGINRDRAG, NMLISTVIEW),
1442 SPNFY(LVN_ODCACHEHINT, NMLVCACHEHINT),
1443 SPNFY(LVN_ITEMACTIVATE, NMITEMACTIVATE),
1444 SPNFY(LVN_ODSTATECHANGED, NMLVODSTATECHANGE),
1445 SPNFY(LVN_HOTTRACK, NMLISTVIEW),
1446 SPNFY(LVN_GETDISPINFOA, NMLVDISPINFOA),
1447 SPNFY(LVN_SETDISPINFOA, NMLVDISPINFOA),
1448 SPNFY(LVN_ODFINDITEMA, NMLVFINDITEM),
1449 SPNFY(LVN_KEYDOWN, NMLVKEYDOWN),
1450 SPNFY(LVN_MARQUEEBEGIN, NMLISTVIEW),
1451 SPNFY(LVN_GETINFOTIPA, NMLVGETINFOTIPA),
1452 SPNFY(LVN_GETINFOTIPW, NMLVGETINFOTIPW),
1453 SPNFY(LVN_BEGINLABELEDITW, NMLVDISPINFOW),
1454 SPNFY(LVN_ENDLABELEDITW, NMLVDISPINFOW),
1455 SPNFY(LVN_GETDISPINFOW, NMLVDISPINFOW),
1456 SPNFY(LVN_SETDISPINFOW, NMLVDISPINFOW),
1457 SPNFY(LVN_ODFINDITEMW, NMLVFINDITEM),
1458 /* Header 0U-300U to 0U-399U */
1459 SPNFY(HDN_ITEMCHANGINGA, NMHDR),
1460 SPNFY(HDN_ITEMCHANGEDA, NMHDR),
1461 SPNFY(HDN_ITEMCLICKA, NMHDR),
1462 SPNFY(HDN_ITEMDBLCLICKA, NMHDR),
1463 SPNFY(HDN_DIVIDERDBLCLICKA, NMHDR),
1464 SPNFY(HDN_BEGINTRACKA, NMHDR),
1465 SPNFY(HDN_ENDTRACKA, NMHDR),
1466 SPNFY(HDN_GETDISPINFOA, NMHDR),
1467 SPNFY(HDN_BEGINDRAG, NMHDR),
1468 SPNFY(HDN_ENDDRAG, NMHDR),
1469 SPNFY(HDN_ITEMCHANGINGW, NMHDR),
1470 SPNFY(HDN_ITEMCHANGEDW, NMHDR),
1471 SPNFY(HDN_ITEMCLICKW, NMHDR),
1472 SPNFY(HDN_ITEMDBLCLICKW, NMHDR),
1473 SPNFY(HDN_DIVIDERDBLCLICKW, NMHDR),
1474 SPNFY(HDN_BEGINTRACKW, NMHDR),
1475 SPNFY(HDN_ENDTRACKW, NMHDR),
1476 SPNFY(HDN_GETDISPINFOW, NMHDR),
1477 /* Treeview 0U-400U to 0U-499U */
1478 SPNFY(TVN_SELCHANGINGA, NMHDR),
1479 SPNFY(TVN_SELCHANGEDA, NMHDR),
1480 SPNFY(TVN_GETDISPINFOA, NMHDR),
1481 SPNFY(TVN_SETDISPINFOA, NMHDR),
1482 SPNFY(TVN_ITEMEXPANDINGA, NMHDR),
1483 SPNFY(TVN_ITEMEXPANDEDA, NMHDR),
1484 SPNFY(TVN_BEGINDRAGA, NMHDR),
1485 SPNFY(TVN_BEGINRDRAGA, NMHDR),
1486 SPNFY(TVN_DELETEITEMA, NMHDR),
1487 SPNFY(TVN_BEGINLABELEDITA, NMHDR),
1488 SPNFY(TVN_ENDLABELEDITA, NMHDR),
1489 SPNFY(TVN_KEYDOWN, NMHDR),
1490 SPNFY(TVN_SELCHANGINGW, NMHDR),
1491 SPNFY(TVN_SELCHANGEDW, NMHDR),
1492 SPNFY(TVN_GETDISPINFOW, NMHDR),
1493 SPNFY(TVN_SETDISPINFOW, NMHDR),
1494 SPNFY(TVN_ITEMEXPANDINGW, NMHDR),
1495 SPNFY(TVN_ITEMEXPANDEDW, NMHDR),
1496 SPNFY(TVN_BEGINDRAGW, NMHDR),
1497 SPNFY(TVN_BEGINRDRAGW, NMHDR),
1498 SPNFY(TVN_DELETEITEMW, NMHDR),
1499 SPNFY(TVN_BEGINLABELEDITW, NMHDR),
1500 SPNFY(TVN_ENDLABELEDITW, NMHDR),
1501 /* Tooltips 0U-520U to 0U-549U */
1502 /* Tab 0U-550U to 0U-580U */
1503 SPNFY(TCN_KEYDOWN, NMHDR),
1504 SPNFY(TCN_SELCHANGE, NMHDR),
1505 SPNFY(TCN_SELCHANGING, NMHDR),
1506 SPNFY(TCN_GETOBJECT, NMHDR),
1507 /* Common Dialog 0U-601U to 0U-699U */
1508 /* Toolbar 0U-700U to 0U-720U */
1509 SPNFY(TBN_GETBUTTONINFOA, NMTOOLBARA),
1510 SPNFY(TBN_BEGINDRAG, NMTOOLBARA),
1511 SPNFY(TBN_ENDDRAG, NMTOOLBARA),
1512 SPNFY(TBN_BEGINADJUST, NMHDR),
1513 SPNFY(TBN_ENDADJUST, NMHDR),
1514 SPNFY(TBN_RESET, NMHDR),
1515 SPNFY(TBN_QUERYINSERT, NMTOOLBARA),
1516 SPNFY(TBN_QUERYDELETE, NMTOOLBARA),
1517 SPNFY(TBN_TOOLBARCHANGE, NMHDR),
1518 SPNFY(TBN_CUSTHELP, NMHDR),
1519 SPNFY(TBN_DROPDOWN, NMTOOLBARA),
1520 SPNFY(TBN_GETOBJECT, NMOBJECTNOTIFY),
1521 SPNFY(TBN_HOTITEMCHANGE, NMTBHOTITEM),
1522 SPNFY(TBN_DRAGOUT, NMTOOLBARA),
1523 SPNFY(TBN_DELETINGBUTTON, NMTOOLBARA),
1524 SPNFY(TBN_GETDISPINFOA, NMTBDISPINFOA),
1525 SPNFY(TBN_GETDISPINFOW, NMTBDISPINFOW),
1526 SPNFY(TBN_GETINFOTIPA, NMTBGETINFOTIPA),
1527 SPNFY(TBN_GETINFOTIPW, NMTBGETINFOTIPW),
1528 SPNFY(TBN_GETBUTTONINFOW, NMTOOLBARW),
1529 /* Up/Down 0U-721U to 0U-740U */
1530 /* Month Calendar 0U-750U to 0U-759U */
1531 /* Date/Time 0U-760U to 0U-799U */
1532 /* ComboBoxEx 0U-800U to 0U-830U */
1533 SPNFY(CBEN_GETDISPINFOA, NMCOMBOBOXEXA),
1534 SPNFY(CBEN_INSERTITEM, NMCOMBOBOXEXA),
1535 SPNFY(CBEN_DELETEITEM, NMCOMBOBOXEXA),
1536 SPNFY(CBEN_BEGINEDIT, NMHDR),
1537 SPNFY(CBEN_ENDEDITA, NMCBEENDEDITA),
1538 SPNFY(CBEN_ENDEDITW, NMCBEENDEDITW),
1539 SPNFY(CBEN_GETDISPINFOW, NMCOMBOBOXEXW),
1540 SPNFY(CBEN_DRAGBEGINA, NMCBEDRAGBEGINA),
1541 SPNFY(CBEN_DRAGBEGINW, NMCBEDRAGBEGINW),
1542 /* Rebar 0U-831U to 0U-859U */
1543 SPNFY(RBN_HEIGHTCHANGE, NMHDR),
1544 SPNFY(RBN_GETOBJECT, NMOBJECTNOTIFY),
1545 SPNFY(RBN_LAYOUTCHANGED, NMHDR),
1546 SPNFY(RBN_AUTOSIZE, NMRBAUTOSIZE),
1547 SPNFY(RBN_BEGINDRAG, NMREBAR),
1548 SPNFY(RBN_ENDDRAG, NMREBAR),
1549 SPNFY(RBN_DELETINGBAND, NMREBAR),
1550 SPNFY(RBN_DELETEDBAND, NMREBAR),
1551 SPNFY(RBN_CHILDSIZE, NMREBARCHILDSIZE),
1552 /* IP Adderss 0U-860U to 0U-879U */
1553 /* Status bar 0U-880U to 0U-899U */
1554 /* Pager 0U-900U to 0U-950U */
1555 SPNFY(PGN_SCROLL, NMPGSCROLL),
1556 SPNFY(PGN_CALCSIZE, NMPGCALCSIZE),
1558 static const SPY_NOTIFY *end_spnfy_array; /* ptr to last good entry in array */
1562 static BOOL16 SPY_Exclude[SPY_MAX_MSGNUM+1];
1563 static BOOL16 SPY_ExcludeDWP = 0;
1564 static int SPY_IndentLevel = 0;
1566 #define SPY_EXCLUDE(msg) \
1567 (SPY_Exclude[(msg) > SPY_MAX_MSGNUM ? SPY_MAX_MSGNUM : (msg)])
1572 UINT msgnum; /* message number */
1573 HWND msg_hwnd; /* window handle for message */
1574 WPARAM wParam; /* message parameter */
1575 LPARAM lParam; /* message parameter */
1576 INT data_len; /* length of data to dump */
1577 char msg_name[60]; /* message name (see SPY_GetMsgName) */
1578 CHAR wnd_class[60]; /* window class name (full) */
1579 CHAR wnd_name[16]; /* window name for message */
1582 /* This is defined so that the external entry point can return the addr */
1583 static SPY_INSTANCE ext_sp_e;
1586 /***********************************************************************
1587 * SPY_GetMsgInternal
1589 static const char *SPY_GetMsgInternal( UINT msg )
1591 static char msg_buffer[20];
1593 if (msg <= SPY_MAX_MSGNUM)
1595 if (!MessageTypeNames[msg]) return "???";
1596 return MessageTypeNames[msg];
1599 if (msg >= LVM_FIRST && msg <= LVM_FIRST + SPY_MAX_LVMMSGNUM)
1601 if (!LVMMessageTypeNames[msg-LVM_FIRST]) return "LVM_?";
1602 return LVMMessageTypeNames[msg-LVM_FIRST];
1605 if (msg >= TV_FIRST && msg <= TV_FIRST + SPY_MAX_TVMSGNUM)
1607 if (!TVMessageTypeNames[msg-TV_FIRST]) return "TV_?";
1608 return TVMessageTypeNames[msg-TV_FIRST];
1611 if (msg >= HDM_FIRST && msg <= HDM_FIRST + SPY_MAX_HDMMSGNUM)
1613 if (!HDMMessageTypeNames[msg-HDM_FIRST]) return "HDM_?";
1614 return HDMMessageTypeNames[msg-HDM_FIRST];
1617 if (msg >= TCM_FIRST && msg <= TCM_FIRST + SPY_MAX_TCMMSGNUM)
1619 if (!TCMMessageTypeNames[msg-TCM_FIRST]) return "TCM_?";
1620 return TCMMessageTypeNames[msg-TCM_FIRST];
1623 if (msg >= PGM_FIRST && msg <= PGM_FIRST + SPY_MAX_PGMMSGNUM)
1625 if (!PGMMessageTypeNames[msg-PGM_FIRST]) return "PGM_?";
1626 return PGMMessageTypeNames[msg-PGM_FIRST];
1629 if (msg >= CCM_FIRST && msg <= CCM_FIRST + SPY_MAX_CCMMSGNUM)
1631 if (!CCMMessageTypeNames[msg-CCM_FIRST]) return "???";
1632 return CCMMessageTypeNames[msg-CCM_FIRST];
1635 sprintf( msg_buffer, "WM_USER+%04x", msg - WM_USER );
1639 /***********************************************************************
1642 const USER_MSG *SPY_Bsearch_Msg( const USER_MSG *first, const USER_MSG *last, UINT code)
1645 const USER_MSG *test;
1647 while (last >= first) {
1648 count = 1 + last - first;
1650 /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1651 code, first->value, first->name, last->value, last->name, last->len); */
1652 if (first->value == code) return first;
1653 if (last->value == code) return last;
1657 test = first + count;
1658 /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1659 first, last, test, test->value, code, count); */
1660 if (test->value == code) return test;
1661 if (test->value > code)
1669 /***********************************************************************
1672 * Get message name and other information for dumping
1674 static void SPY_GetMsgStuff( SPY_INSTANCE *sp_e )
1678 sp_e->msg_name[sizeof(sp_e->msg_name)-1] = 0;
1679 strncpy (sp_e->msg_name, SPY_GetMsgInternal( sp_e->msgnum ),
1680 sizeof(sp_e->msg_name)-1);
1683 if (strncmp(sp_e->msg_name, "WM_USER+", 8) == 0) {
1686 /* TRACE("looking class %s\n", sp_e->wnd_class); */
1688 while (cc_array[i].classname &&
1689 strcmp(cc_array[i].classname, sp_e->wnd_class) !=0) i++;
1691 if (!cc_array[i].classname) return;
1692 /* TRACE("process class %s, first %p, last %p\n",
1693 cc_array[i].classname, cc_array[i].classmsg,
1694 cc_array[i].lastmsg); */
1695 p = SPY_Bsearch_Msg (cc_array[i].classmsg, cc_array[i].lastmsg,
1698 strncpy (sp_e->msg_name, p->name, sizeof(sp_e->msg_name)-1);
1699 sp_e->data_len = p->len;
1704 /***********************************************************************
1707 * Sets the value of "wnd_name" and "wnd_class" members of the
1708 * instance structure.
1711 void SPY_GetWndName( SPY_INSTANCE *sp_e )
1713 WND* pWnd = WIN_FindWndPtr( sp_e->msg_hwnd );
1716 LPSTR p = (LPSTR)&sp_e->wnd_name;
1717 LPSTR s = (LPSTR)&sp_e->wnd_name;
1721 /* save and restore error code over the next call */
1722 save_error = GetLastError();
1723 GlobalGetAtomNameA((ATOM) GetClassWord(pWnd->hwndSelf, GCW_ATOM),
1724 (LPSTR)&sp_e->wnd_class,
1725 sizeof(sp_e->wnd_class)-1);
1726 SetLastError(save_error);
1728 if( pWnd->text && pWnd->text[0] != '\0' )
1730 LPWSTR src = pWnd->text;
1731 int n=sizeof(sp_e->wnd_name)-2;
1732 *(p++) = postfix = '\"';
1733 while ((n-- > 0) && *src) *p++ = *src++;
1735 else /* get class name */
1737 LPSTR src = (LPSTR)&sp_e->wnd_class;
1738 int n=sizeof(sp_e->wnd_name)-2;
1740 while ((n-- > 0) && *src) *p++ = *src++;
1744 if( p-s >= sizeof(sp_e->wnd_name)-1 ) {
1745 p = s + sizeof(sp_e->wnd_name)-5;
1752 WIN_ReleaseWndPtr(pWnd);
1755 else {strcpy( sp_e->wnd_name, "\"NULL\"" ); sp_e->wnd_class[0] = 0;}
1759 /***********************************************************************
1762 * **** External function ****
1766 const char *SPY_GetMsgName( UINT msg, HWND hWnd )
1768 ext_sp_e.msgnum = msg;
1769 ext_sp_e.msg_hwnd = hWnd;
1770 ext_sp_e.lParam = 0;
1771 ext_sp_e.wParam = 0;
1772 SPY_GetWndName(&ext_sp_e);
1773 SPY_GetMsgStuff(&ext_sp_e);
1774 return ext_sp_e.msg_name;
1777 /***********************************************************************
1780 const char *SPY_GetVKeyName(WPARAM wParam)
1782 const char *vk_key_name;
1784 if(wParam <= SPY_MAX_VKKEYSNUM && VK_KeyNames[wParam])
1785 vk_key_name = VK_KeyNames[wParam];
1787 vk_key_name = "VK_???";
1792 /***********************************************************************
1793 * SPY_Bsearch_Notify
1795 const SPY_NOTIFY *SPY_Bsearch_Notify( const SPY_NOTIFY *first, const SPY_NOTIFY *last, UINT code)
1798 const SPY_NOTIFY *test;
1800 while (last >= first) {
1801 count = 1 + last - first;
1803 /* TRACE("code=%d, f-value=%d, f-name=%s, l-value=%d, l-name=%s, l-len=%d,\n",
1804 code, first->value, first->name, last->value, last->name, last->len); */
1805 if (first->value == code) return first;
1806 if (last->value == code) return last;
1810 test = first + count;
1811 /* TRACE("first=%p, last=%p, test=%p, t-value=%d, code=%d, count=%d\n",
1812 first, last, test, test->value, code, count); */
1813 if (test->value == code) return test;
1814 if (test->value < code)
1822 /***********************************************************************
1825 void SPY_DumpMem (LPSTR header, UINT *q, INT len)
1829 for(i=0; i<len-12; i+=16) {
1830 TRACE("%s [%04x] %08x %08x %08x %08x\n",
1831 header, i, *q, *(q+1), *(q+2), *(q+3));
1836 TRACE("%s [%04x] %08x %08x %08x\n",
1837 header, i, *q, *(q+1), *(q+2));
1840 TRACE("%s [%04x] %08x %08x\n",
1841 header, i, *q, *(q+1));
1844 TRACE("%s [%04x] %08x\n",
1852 /***********************************************************************
1855 void SPY_DumpStructure (SPY_INSTANCE *sp_e, BOOL enter)
1857 switch (sp_e->msgnum)
1862 DRAWITEMSTRUCT *lpdis = (DRAWITEMSTRUCT*) sp_e->lParam;
1863 TRACE("DRAWITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
1864 lpdis->CtlType, lpdis->CtlID);
1865 TRACE("itemID=0x%08x itemAction=0x%08x itemState=0x%08x\n",
1866 lpdis->itemID, lpdis->itemAction, lpdis->itemState);
1867 TRACE("hWnd=0x%04x hDC=0x%04x (%d,%d)-(%d,%d) itemData=0x%08lx\n",
1868 lpdis->hwndItem, lpdis->hDC, lpdis->rcItem.left,
1869 lpdis->rcItem.top, lpdis->rcItem.right,
1870 lpdis->rcItem.bottom, lpdis->itemData);
1873 case WM_MEASUREITEM:
1875 MEASUREITEMSTRUCT *lpmis = (MEASUREITEMSTRUCT*) sp_e->lParam;
1876 TRACE("MEASUREITEMSTRUCT: CtlType=0x%08x CtlID=0x%08x\n",
1877 lpmis->CtlType, lpmis->CtlID);
1878 TRACE("itemID=0x%08x itemWidth=0x%08x itemHeight=0x%08x\n",
1879 lpmis->itemID, lpmis->itemWidth, lpmis->itemHeight);
1880 TRACE("itemData=0x%08lx\n", lpmis->itemData);
1883 case WM_WINDOWPOSCHANGED:
1885 case WM_WINDOWPOSCHANGING:
1887 WINDOWPOS *lpwp = (WINDOWPOS *)sp_e->lParam;
1888 TRACE("WINDOWPOS hwnd=0x%04x, after=0x%04x, at (%d,%d) w=%d h=%d, flags=0x%08x\n",
1889 lpwp->hwnd, lpwp->hwndInsertAfter, lpwp->x, lpwp->y,
1890 lpwp->cx, lpwp->cy, lpwp->flags);
1893 case WM_STYLECHANGED:
1895 case WM_STYLECHANGING:
1897 LPSTYLESTRUCT ss = (LPSTYLESTRUCT) sp_e->lParam;
1898 TRACE("STYLESTRUCT: StyleOld=0x%08lx, StyleNew=0x%08lx\n",
1899 ss->styleOld, ss->styleNew);
1904 RECT *rc = (RECT *)sp_e->lParam;
1905 TRACE("Rect (%d,%d)-(%d,%d)\n",
1906 rc->left, rc->top, rc->right, rc->bottom);
1912 NMHDR * pnmh = (NMHDR*) sp_e->lParam;
1914 const SPY_NOTIFY *p;
1916 p = SPY_Bsearch_Notify (&spnfy_array[0], end_spnfy_array,
1919 TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=%s<0x%08x>, extra=0x%x\n",
1920 pnmh->hwndFrom, pnmh->idFrom, p->name, pnmh->code, p->len);
1922 q = (UINT *)(pnmh + 1);
1923 SPY_DumpMem ("NM extra", q, (INT)p->len);
1927 TRACE("NMHDR hwndFrom=0x%08x idFrom=0x%08x code=0x%08x\n",
1928 pnmh->hwndFrom, pnmh->idFrom, pnmh->code);
1931 if (sp_e->data_len > 0)
1932 SPY_DumpMem ("MSG lParam", (UINT *)sp_e->lParam, sp_e->data_len);
1937 /***********************************************************************
1940 void SPY_EnterMessage( INT iFlag, HWND hWnd, UINT msg,
1941 WPARAM wParam, LPARAM lParam )
1945 if (!TRACE_ON(message) || SPY_EXCLUDE(msg)) return;
1948 sp_e.msg_hwnd = hWnd;
1949 sp_e.lParam = lParam;
1950 sp_e.wParam = wParam;
1951 SPY_GetWndName(&sp_e);
1952 SPY_GetMsgStuff(&sp_e);
1954 /* each SPY_SENDMESSAGE must be complemented by call to SPY_ExitMessage */
1957 case SPY_DISPATCHMESSAGE16:
1958 TRACE("%*s(%04x) %-16s message [%04x] %s dispatched wp=%04x lp=%08lx\n",
1959 SPY_IndentLevel, "", WIN_Handle16(hWnd),
1960 sp_e.wnd_name, msg, sp_e.msg_name, wParam, lParam);
1963 case SPY_DISPATCHMESSAGE:
1964 TRACE("%*s(%08x) %-16s message [%04x] %s dispatched wp=%08x lp=%08lx\n",
1965 SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
1966 sp_e.msg_name, wParam, lParam);
1969 case SPY_SENDMESSAGE16:
1970 case SPY_SENDMESSAGE:
1973 HTASK16 hTask = GetWindowTask16( WIN_Handle16(hWnd) );
1975 if (hTask == GetCurrentTask()) strcpy( taskName, "self" );
1976 else if (!hTask) strcpy( taskName, "Wine" );
1979 sprintf( taskName, "task %04x ???", hTask );
1980 GetModuleName16( hTask, taskName + 10, sizeof(taskName) - 10 );
1983 if (iFlag == SPY_SENDMESSAGE16)
1984 TRACE("%*s(%04x) %-16s message [%04x] %s sent from %s wp=%04x lp=%08lx\n",
1985 SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg,
1986 sp_e.msg_name, taskName, wParam, lParam );
1988 { TRACE("%*s(%08x) %-16s message [%04x] %s sent from %s wp=%08x lp=%08lx\n",
1989 SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
1990 sp_e.msg_name, taskName, wParam, lParam );
1991 SPY_DumpStructure(&sp_e, TRUE);
1996 case SPY_DEFWNDPROC16:
1997 if( SPY_ExcludeDWP ) return;
1998 TRACE("%*s(%04x) DefWindowProc16: %s [%04x] wp=%04x lp=%08lx\n",
1999 SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, wParam, lParam );
2002 case SPY_DEFWNDPROC:
2003 if( SPY_ExcludeDWP ) return;
2004 TRACE("%*s(%08x) DefWindowProc32: %s [%04x] wp=%08x lp=%08lx\n",
2005 SPY_IndentLevel, "", hWnd, sp_e.msg_name,
2006 msg, wParam, lParam );
2009 SPY_IndentLevel += SPY_INDENT_UNIT;
2013 /***********************************************************************
2016 void SPY_ExitMessage( INT iFlag, HWND hWnd, UINT msg, LRESULT lReturn,
2017 WPARAM wParam, LPARAM lParam )
2021 if (!TRACE_ON(message) || SPY_EXCLUDE(msg) ||
2022 (SPY_ExcludeDWP && (iFlag == SPY_RESULT_DEFWND16 || iFlag == SPY_RESULT_DEFWND)) )
2026 sp_e.msg_hwnd = hWnd;
2027 sp_e.lParam = lParam;
2028 sp_e.wParam = wParam;
2029 SPY_GetWndName(&sp_e);
2030 SPY_GetMsgStuff(&sp_e);
2032 if (SPY_IndentLevel) SPY_IndentLevel -= SPY_INDENT_UNIT;
2036 case SPY_RESULT_DEFWND16:
2037 TRACE(" %*s(%04x) DefWindowProc16: %s [%04x] returned %08lx\n",
2038 SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.msg_name, msg, lReturn );
2041 case SPY_RESULT_DEFWND:
2042 TRACE(" %*s(%08x) DefWindowProc32: %s [%04x] returned %08lx\n",
2043 SPY_IndentLevel, "", hWnd, sp_e.msg_name, msg, lReturn );
2046 case SPY_RESULT_OK16:
2047 TRACE(" %*s(%04x) %-16s message [%04x] %s returned %08lx\n",
2048 SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg,
2049 sp_e.msg_name, lReturn );
2053 TRACE(" %*s(%08x) %-16s message [%04x] %s returned %08lx\n",
2054 SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
2055 sp_e.msg_name, lReturn );
2056 SPY_DumpStructure(&sp_e, FALSE);
2059 case SPY_RESULT_INVALIDHWND16:
2060 WARN(" %*s(%04x) %-16s message [%04x] %s HAS INVALID HWND\n",
2061 SPY_IndentLevel, "", WIN_Handle16(hWnd), sp_e.wnd_name, msg, sp_e.msg_name );
2064 case SPY_RESULT_INVALIDHWND:
2065 WARN(" %*s(%08x) %-16s message [%04x] %s HAS INVALID HWND\n",
2066 SPY_IndentLevel, "", hWnd, sp_e.wnd_name, msg,
2073 /***********************************************************************
2080 const SPY_NOTIFY *p;
2084 if (!TRACE_ON(message)) return TRUE;
2087 if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2089 DWORD type, count = sizeof(buffer);
2090 RegQueryValueExA(hkey, "Include", 0, &type, buffer, &count);
2093 if (buffer[0] && strcmp( buffer, "INCLUDEALL" ))
2095 TRACE("Include=%s\n", buffer );
2096 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2097 SPY_Exclude[i] = (MessageTypeNames[i] && !strstr(buffer,MessageTypeNames[i]));
2101 if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2103 DWORD type, count = sizeof(buffer);
2104 RegQueryValueExA(hkey, "Exclude", 0, &type, buffer, &count);
2109 TRACE("Exclude=%s\n", buffer );
2110 if (!strcmp( buffer, "EXCLUDEALL" ))
2111 for (i = 0; i <= SPY_MAX_MSGNUM; i++) SPY_Exclude[i] = TRUE;
2113 for (i = 0; i <= SPY_MAX_MSGNUM; i++)
2114 SPY_Exclude[i] = (MessageTypeNames[i] && strstr(buffer,MessageTypeNames[i]));
2118 if(!RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\Spy", &hkey))
2120 DWORD type, count = sizeof(buffer);
2121 if(!RegQueryValueExA(hkey, "ExcludeDWP", 0, &type, buffer, &count))
2122 SPY_ExcludeDWP = atoi(buffer);
2126 /* find last good entry in spy notify array and save addr for b-search */
2127 p = &spnfy_array[0];
2130 if ((UINT)p->value > (UINT)j) {
2131 ERR("Notify message array out of order\n");
2132 ERR(" between values [%08x] %s and [%08x] %s\n",
2133 j, (p-1)->name, p->value, p->name);
2140 end_spnfy_array = p;
2142 /* find last good entry in each common control message array
2143 * and save addr for b-search.
2146 while (cc_array[i].classname) {
2148 j = 0x0400; /* minimum entry in array */
2149 q = cc_array[i].classmsg;
2151 if (q->value <= j) {
2152 ERR("Class message array out of order for class ""%s""\n",
2153 cc_array[i].classname);
2154 ERR(" between values [%04x] %s and [%04x] %s\n",
2155 j, (q-1)->name, q->value, q->name);
2162 cc_array[i].lastmsg = (USER_MSG *)q;