|
|
1.1 root 1:
2: /******************************************************************************\
3: * This is a part of the Microsoft Source Code Samples.
4: * Copyright (C) 1993 Microsoft Corporation.
5: * All rights reserved.
6: * This source code is only intended as a supplement to
7: * Microsoft Development Tools and/or WinHelp documentation.
8: * See these sources for detailed information regarding the
9: * Microsoft samples programs.
10: \******************************************************************************/
11:
12: /*****************************************************************************\
13: *
14: * Module: dialogs.c
15: *
16: * Contains dialog procs for the Windows debugging Spy SDK applet.
17: *
18: * Functions:
19: *
20: * MyDialogBox()
21: * AboutDlgProc()
22: * SelectWindowDlgProc()
23: * OutputDlgProc()
24: * SelectFont()
25: * MessagesDlgProc()
26: * SelectWindowCommand()
27: * FillListBox()
28: * AddOneWindow()
29: * MakeWindowName()
30: * FindHwndInListBox()
31: * HighlightWindow()
32: * SelectWindowUpdateInfo()
33: * SelectWindowEnableFields()
34: * OutputCommand()
35: * MessagesInit()
36: * MessagesCommand()
37: * MessagesUpdateCheckBoxes()
38: *
39: * Comments:
40: *
41: \*****************************************************************************/
42:
43: #include "spy.h"
44:
45: #include <commdlg.h>
46:
47:
48: #define DINV 3
49:
50:
51: PRIVATE HWND ghwndSpyingOnTemp; // Temp when selecting hwnd to spy on.
52: PRIVATE HWND ghwndDlgBeingFilled = NULL;
53: PRIVATE BOOL bBorderOn = FALSE;
54: PRIVATE INT gcItemsSave;
55:
56:
57: PRIVATE BOOL SelectWindowCommand(HWND hwnd, INT nCmd, INT nNotifyCode);
58: PRIVATE VOID FillListBox(HWND hDlg, HWND hwndList, HWND hwnd);
59: BOOL CALLBACK AddOneWindow(HWND hwnd, HWND hwndList);
60: PRIVATE VOID MakeWindowName(HWND hwnd, LPSTR lpString, INT nStringLen);
61: PRIVATE INT FindHwndInListBox(HWND hwndList, HWND hSpyWnd);
62: PRIVATE VOID HighlightWindow(HWND hwnd, BOOL fDraw);
63: PRIVATE VOID SelectWindowUpdateInfo(HWND hDlg, HWND hwnd);
64: PRIVATE VOID SelectWindowEnableFields(HWND hwnd, BOOL fEnable);
65: PRIVATE BOOL OutputCommand(HWND hwnd, INT nCmd, INT nNotifyCode);
66: PRIVATE VOID MessagesInit(HWND hwnd);
67: PRIVATE BOOL MessagesCommand(HWND hwnd, INT nCmd, INT nNotifyCode);
68: PRIVATE VOID MessagesUpdateCheckBoxes(HWND hwnd);
69:
70:
71: CHAR szConsoleWindowClass[] = "ConsoleWindowClass";
72:
73: /*****************************************************************************\
74: * MyDialogBox
75: *
76: * Puts up the specified dialog.
77: *
78: * Arguments:
79: * INT idDlg - The resource id of the dialog to display.
80: * DLGPROC pfnDlgProc - The dialog proc to use.
81: *
82: * Returns:
83: * The return value from DialogBox (whatever the dialog proc passes
84: * to EndDialog).
85: \*****************************************************************************/
86:
87: BOOL
88: MyDialogBox(
89: INT idDlg,
90: DLGPROC pfnDlgProc
91: )
92: {
93: return DialogBox(ghInst, MAKEINTRESOURCE(idDlg), ghwndSpyApp, pfnDlgProc);
94: }
95:
96:
97:
98: /*****************************************************************************\
99: * AboutDlgProc
100: *
101: * Dialog proc for the About box.
102: *
103: \*****************************************************************************/
104:
105: BOOL CALLBACK
106: AboutDlgProc(
107: HWND hwnd,
108: UINT msg,
109: WPARAM wParam,
110: LPARAM lParam
111: )
112: {
113: switch (msg) {
114: case WM_INITDIALOG:
115: return TRUE;
116:
117: case WM_COMMAND:
118: EndDialog(hwnd, IDOK);
119: break;
120: }
121:
122: return FALSE;
123: }
124:
125:
126:
127: /*****************************************************************************\
128: * SelectWindowDlgProc
129: *
130: * Dialog proc for the Select Window dialog. This dialog allows the user
131: * to select which window they want to spy on.
132: *
133: * Arguments:
134: * HWND hwnd - Window handle of the dialog.
135: * UINT msg - Message sent to window.
136: * WPARAM wParam - Message parameter.
137: * LPARAM lParam - Message parameter.
138: *
139: * Returns:
140: * The value that the dialog proc should return, based on the processing
141: * of the specific WM_COMMAND message received.
142: \*****************************************************************************/
143:
144: BOOL CALLBACK
145: SelectWindowDlgProc(
146: HWND hwnd,
147: UINT msg,
148: WPARAM wParam,
149: LPARAM lParam
150: )
151: {
152: HWND hwndList;
153: INT nIndex;
154:
155: UNREFERENCED_PARAMETER(lParam);
156:
157: switch (msg)
158: {
159: case WM_INITDIALOG:
160: hwndList = GetDlgItem(hwnd, DID_SELWINLIST);
161: ghwndSpyingOnTemp = ghwndSpyingOn == HWND_ALL ? NULL : (ghwndSpyingOn == NULL ? NULL
162: : GetParent(ghwndSpyingOn));
163: FillListBox(hwnd, hwndList, ghwndSpyingOnTemp);
164: nIndex = FindHwndInListBox(hwndList, ghwndSpyingOn == HWND_ALL ? NULL
165: : ghwndSpyingOn);
166: SendMessage(hwndList, LB_SETCURSEL, nIndex, 0);
167: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA, nIndex, 0);
168: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp);
169: CheckDlgButton(hwnd, DID_SELWINALLWINDOWS, gfSpyAll);
170: SelectWindowEnableFields(hwnd, !gfSpyAll);
171: SetFocus(hwnd);
172: HighlightWindow(ghwndSpyingOnTemp, TRUE);
173:
174: return TRUE;
175:
176: case WM_NCLBUTTONDOWN:
177: if (wParam == HTCAPTION)
178: {
179: //
180: // The mouse is down for a move of the dialog, so clean up the
181: // border stuff.
182: //
183: if (bBorderOn)
184: HighlightWindow(ghwndSpyingOnTemp, FALSE);
185: }
186:
187: return FALSE;
188:
189: case WM_KEYDOWN:
190: case WM_LBUTTONUP:
191: case WM_NCLBUTTONUP:
192: //
193: // The mouse is up from a move of the dialog, so put up the
194: // border stuff again.
195: //
196: if (!bBorderOn)
197: HighlightWindow(ghwndSpyingOnTemp, TRUE);
198:
199: return FALSE;
200:
201: case WM_CANCELMODE:
202: return FALSE;
203:
204: case WM_COMMAND:
205: return SelectWindowCommand(hwnd, LOWORD(wParam), HIWORD(wParam));
206: }
207:
208: return FALSE;
209: }
210:
211:
212:
213: /*****************************************************************************\
214: * SelectWindowCommand
215: *
216: * Handles thw WM_COMMAND messages for the Select Window dialog.
217: *
218: * Arguments:
219: * HWND hwnd - Window handle of the dialog.
220: * INT nCmd - Command value.
221: * INT nNotifyCode - The notify code.
222: *
223: * Returns:
224: * The value that the dialog proc should return, based on the processing
225: * of the specific WM_COMMAND message received.
226: \*****************************************************************************/
227:
228: PRIVATE BOOL
229: SelectWindowCommand(
230: HWND hwnd,
231: INT nCmd,
232: INT nNotifyCode
233: )
234: {
235: INT nIndex;
236: HWND hwndList;
237: CHAR rgString[32];
238:
239: switch (nCmd)
240: {
241: case IDOK:
242: SetWindowToSpyOn(IsDlgButtonChecked(hwnd, DID_SELWINALLWINDOWS) ?
243: HWND_ALL : ghwndSpyingOnTemp);
244:
245: if (bBorderOn)
246: HighlightWindow(ghwndSpyingOnTemp, FALSE);
247:
248: EndDialog(hwnd, IDOK);
249: return TRUE;
250:
251: case IDCANCEL:
252: if (bBorderOn)
253: HighlightWindow(ghwndSpyingOnTemp, FALSE);
254:
255: EndDialog(hwnd, IDCANCEL);
256: return TRUE;
257:
258: case DID_SELWINLIST:
259: //
260: // User single clicked or doubled clicked in listbox -
261: // Single click means select a window to spy on
262: // Double click means enumerate all the children of that window.
263: //
264: hwndList = GetDlgItem(hwnd, DID_SELWINLIST);
265: switch (nNotifyCode)
266: {
267: case LBN_SELCHANGE:
268: //
269: // Single click case. Select a window to spy upon.
270: //
271: // Get the window handle, set it as the window to spy on.
272: //
273:
274: if (bBorderOn)
275: HighlightWindow(ghwndSpyingOnTemp, FALSE);
276:
277: nIndex = (INT)SendMessage(hwndList, LB_GETCURSEL, 0, 0);
278: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA,
279: nIndex, 0);
280: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp);
281:
282: HighlightWindow(ghwndSpyingOnTemp, TRUE);
283:
284: break;
285:
286: case LBN_DBLCLK:
287: //
288: // Double click case - first click has already been
289: // processed as single click. In this case, the user has
290: // requested to look at all the children of a given
291: // selection.
292: //
293: // Get the current selection, and check to see if it is the
294: // " [ parent.. ]" entry. If so, go up one level first.
295: //
296:
297: SetCursor(LoadCursor(NULL, IDC_WAIT));
298:
299: if (bBorderOn)
300: HighlightWindow(ghwndSpyingOnTemp, FALSE);
301:
302: nIndex = (INT)SendMessage(hwndList, LB_GETCURSEL, 0, 0);
303: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA,
304: nIndex, 0);
305: SendMessage(hwndList, LB_GETTEXT, nIndex, (LPARAM)rgString);
306:
307: if (rgString[0] == ' ')
308: {
309: // At top? If so, we are done.
310: if (ghwndSpyingOnTemp == NULL)
311: {
312: SetCursor(LoadCursor(NULL, IDC_ARROW));
313: break;
314: }
315:
316: ghwndSpyingOnTemp = GetParent(ghwndSpyingOnTemp);
317: }
318:
319: SendMessage(hwndList, LB_RESETCONTENT, 0, 0);
320: FillListBox(hwnd, hwndList, ghwndSpyingOnTemp);
321:
322: nIndex = FindHwndInListBox(hwndList, ghwndSpyingOnTemp);
323: SendMessage(hwndList, LB_SETCURSEL, nIndex, 0);
324: ghwndSpyingOnTemp = (HWND)SendMessage(hwndList, LB_GETITEMDATA,
325: nIndex, 0);
326: HighlightWindow(ghwndSpyingOnTemp,TRUE);
327: SelectWindowUpdateInfo(hwnd, ghwndSpyingOnTemp);
328: SetCursor(LoadCursor(NULL, IDC_ARROW));
329: break;
330: }
331:
332: break;
333:
334: case DID_SELWINALLWINDOWS:
335: SelectWindowEnableFields(hwnd,
336: !IsDlgButtonChecked(hwnd, DID_SELWINALLWINDOWS));
337:
338: break;
339: }
340:
341: return FALSE;
342: }
343:
344:
345:
346: /*****************************************************************************\
347: * FillListBox
348: *
349: * Fills the listbox in the Select Window dialog with the names of
350: * the child windows of the given window.
351: *
352: * Arguments:
353: * hDlg - Window handle of the dialog window
354: * hwndList - Handle to the listbox within the dialog.
355: * hwnd - Parent whose children to enumerate.
356: *
357: * Returns:
358: * VOID
359: \*****************************************************************************/
360:
361: PRIVATE VOID
362: FillListBox(
363: HWND hDlg,
364: HWND hwndList,
365: HWND hwnd
366: )
367: {
368: INT nIndex;
369:
370: //
371: // First fill the list box with child windows
372: //
373: // Make sure we display the list box after things are added.
374: //
375:
376: SendMessage(hwndList, WM_SETREDRAW, 0, 0);
377:
378: //
379: // remember which dialog we are processing
380: //
381:
382: ghwndDlgBeingFilled = hDlg;
383:
384: if (hwnd == NULL)
385: {
386: //
387: // Enumerate the top level separately... gross unsymmetry, but
388: // hey.
389: //
390: EnumWindows(AddOneWindow, (LPARAM)hwndList);
391: }
392: else
393: {
394: EnumChildWindows(hwnd, AddOneWindow, (LPARAM)hwndList);
395: }
396:
397: //
398: // Now give the user a method of getting back to the parent. The space at
399: // the beginning of the " [parent]" string identifies the entry as the
400: // parent entry and makes it different from all the other entries since
401: // the others start with a handle number of some sort.
402: //
403:
404: nIndex = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)" [ parent... ]");
405: SendMessage(hwndList, LB_SETITEMDATA, nIndex, (LONG)hwnd);
406:
407: //
408: // Now do the redraw...
409: //
410:
411: SendMessage(hwndList, WM_SETREDRAW, 1, 0);
412: }
413:
414:
415:
416: /*****************************************************************************\
417: * AddOneWindow
418: *
419: * Gets the windows to add to the list of windows to spy on.
420: *
421: * Arguments:
422: * HWND hwnd - handle of the window to add.
423: * HWND hwndList - handle to the listbox.
424: *
425: * Returns:
426: * TRUE - if a window was created.
427: \*****************************************************************************/
428: #define CCH_RGBUF 32
429:
430: BOOL CALLBACK
431: AddOneWindow(
432: HWND hwnd,
433: HWND hwndList
434: )
435: {
436: CHAR rgBuf[CCH_RGBUF];
437: INT nIndex;
438: HWND htemp;
439:
440: //
441: // Make sure we don't add any window that has anything to do with
442: // the dialog or any other spy window
443: //
444:
445: htemp = GetParent(hwnd);
446:
447: // Don't put console windows in the list since they can not be hooked
448: if (GetClassName(hwnd, (LPTSTR) rgBuf, CCH_RGBUF) != 0 &&
449: strcmp(rgBuf, szConsoleWindowClass) == 0 )
450: {
451: return 1;
452: }
453:
454: // Don't put windows that belong to spy in the list
455: if (hwnd == ghwndDlgBeingFilled || htemp == ghwndDlgBeingFilled
456: || hwnd == ghwndSpyApp
457: || htemp == ghwndSpyApp || hwnd == ghwndPrintf || htemp == ghwndPrintf
458: || hwnd == ghwndSpyHook || htemp == ghwndSpyHook)
459: {
460: return 1;
461: }
462:
463: MakeWindowName(hwnd, rgBuf, CCH_RGBUF);
464:
465: nIndex = SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)rgBuf);
466:
467: if (nIndex == LB_ERR || nIndex == LB_ERRSPACE)
468: return 0;
469:
470: if (SendMessage(hwndList, LB_SETITEMDATA, nIndex, (LPARAM)hwnd) == LB_ERR)
471: return 0;
472:
473: return 1;
474: }
475:
476:
477:
478: /*****************************************************************************\
479: * MakeWindowName
480: *
481: * Builds the window name from the window handle passed in.
482: *
483: * Arguments:
484: * HWND hwnd - handle to the window.
485: * LPSTR lpString - String to put window name into.
486: * INT nSTringLen - Length of window string.
487: *
488: * Returns:
489: * VOID
490: \*****************************************************************************/
491:
492: PRIVATE VOID
493: MakeWindowName(
494: HWND hwnd,
495: LPSTR lpString,
496: INT nStringLen
497: )
498: {
499: wsprintf(lpString, "%8.8lX:", hwnd);
500:
501: if (hwnd == NULL || !IsWindow(hwnd))
502: {
503: lstrcat(lpString, "!!!");
504: }
505: else
506: {
507: GetWindowText(hwnd, lpString + 9, nStringLen - 9);
508: }
509: }
510:
511:
512:
513: /*****************************************************************************\
514: * FindHwndInListBox
515: *
516: * Gets the window from the list of windows in the listbox.
517: *
518: * Arguments:
519: * HWND hwndList - handle to the listbox.
520: * HWND hSpyWnd - handle to the spy window.
521: *
522: * Returns:
523: * INT - Index to the window in the listbox.
524: \*****************************************************************************/
525:
526: PRIVATE INT
527: FindHwndInListBox(
528: HWND hwndList,
529: HWND hSpyWnd
530: )
531: {
532: CHAR rgBuf[9];
533: INT nIndex;
534:
535: wsprintf(rgBuf, "%08lX", (LONG)hSpyWnd);
536:
537: nIndex = SendMessage(hwndList, LB_FINDSTRING, (WPARAM)-1, (LPARAM)rgBuf);
538:
539: if (nIndex == LB_ERR)
540: nIndex = 0;
541:
542: return nIndex;
543: }
544:
545:
546:
547: /*****************************************************************************\
548: * HighlightWindow
549: *
550: * Used to temporarily highlight the window that the user has selected from
551: * the Select Window dialog. It does this by inverting a border around the
552: * window.
553: *
554: * Arguments:
555: * HWND hwnd - handle to the selected window.
556: * BOOL fdraw - whether to draw the window inverted on non-inverted.
557: *
558: * Returns:
559: * VOID
560: \*****************************************************************************/
561:
562: PRIVATE VOID
563: HighlightWindow(
564: HWND hwnd,
565: BOOL fDraw
566: )
567: {
568: HDC hdc;
569: RECT rc;
570:
571: bBorderOn = fDraw;
572:
573: if (hwnd == NULL || !IsWindow(hwnd))
574: return;
575:
576: hdc = GetWindowDC(hwnd);
577: GetWindowRect(hwnd, &rc);
578: OffsetRect(&rc, -rc.left, -rc.top);
579:
580: if (!IsRectEmpty(&rc))
581: {
582: PatBlt(hdc, rc.left, rc.top, rc.right - rc.left, DINV, DSTINVERT);
583: PatBlt(hdc, rc.left, rc.bottom - DINV, DINV,
584: -(rc.bottom - rc.top - 2 * DINV), DSTINVERT);
585: PatBlt(hdc, rc.right - DINV, rc.top + DINV, DINV,
586: rc.bottom - rc.top - 2 * DINV, DSTINVERT);
587: PatBlt(hdc, rc.right, rc.bottom - DINV, -(rc.right - rc.left),
588: DINV, DSTINVERT);
589: }
590:
591: ReleaseDC(hwnd, hdc);
592: }
593:
594:
595:
596: /*****************************************************************************\
597: * SelectWindowUpdateInfo
598: *
599: * Updates the informational fields in the Select Window dialog when
600: * a new window is selected from the hwnd listbox.
601: *
602: * Arguments:
603: * HWND hDlg - handle to the select window dialog box.
604: * HWND hwnd - handle to the new window selected.
605: *
606: * Returns:
607: * VOID
608: \*****************************************************************************/
609:
610: PRIVATE VOID
611: SelectWindowUpdateInfo(
612: HWND hDlg,
613: HWND hwnd
614: )
615: {
616: HWND hParent;
617: DWORD dwStyle;
618: RECT rc;
619: CHAR szTemp[MAXSTRING];
620:
621: if (hwnd)
622: {
623: hParent = GetParent(hwnd);
624: dwStyle = GetWindowLong(hwnd, GWL_STYLE);
625:
626: MakeWindowName(hwnd, szTemp, MAXSTRING);
627: SetDlgItemText(hDlg, DID_SELWINWINDOW, szTemp);
628:
629: GetClassName(hwnd, szTemp, MAXSTRING);
630: SetDlgItemText(hDlg, DID_SELWINCLASS, szTemp);
631:
632: if (hParent)
633: {
634: MakeWindowName(hParent, szTemp, MAXSTRING);
635: SetDlgItemText(hDlg, DID_SELWINPARENT, szTemp);
636: }
637: else
638: {
639: SetDlgItemText(hDlg, DID_SELWINPARENT, "<No Parent>");
640: }
641:
642: GetWindowRect(hwnd, &rc);
643: wsprintf(szTemp, "(%d,%d)-(%d,%d) %dx%d", rc,
644: rc.right-rc.left, rc.bottom-rc.top);
645: SetDlgItemText(hDlg, DID_SELWINRECT, szTemp);
646:
647: if (dwStyle & WS_POPUP)
648: wsprintf (szTemp, "%08lX: WS_POPUP", dwStyle);
649: else if (dwStyle & WS_CHILD)
650: wsprintf (szTemp, "%08lX: WS_CHILD, ID: %lX", dwStyle,
651: GetWindowLong(hwnd, GWL_ID));
652: else if (dwStyle & WS_ICONIC)
653: wsprintf (szTemp, "%08lX: WS_ICONIC", dwStyle);
654: else
655: wsprintf (szTemp, "%08lX: WS_OVERLAPPED", dwStyle);
656:
657: SetDlgItemText(hDlg, DID_SELWINSTYLE, szTemp);
658: }
659: else
660: {
661: SetDlgItemText(hDlg, DID_SELWINWINDOW, "<Undefined>");
662: SetDlgItemText(hDlg, DID_SELWINCLASS, "<Undefined>");
663: SetDlgItemText(hDlg, DID_SELWINPARENT, "<Undefined>");
664: SetDlgItemText(hDlg, DID_SELWINRECT, "<Undefined>");
665: SetDlgItemText(hDlg, DID_SELWINSTYLE, "<Undefined>");
666: }
667: }
668:
669:
670:
671: /*****************************************************************************\
672: * SelectWindowEnableFields
673: *
674: * Enables/disables the different fields in the Select Window dialog
675: * based on whether the user wants to spy on all windows or individually
676: * select one.
677: *
678: * Arguments:
679: * HWND hwnd - Dialog window handle.
680: * BOOL fEnable - TRUE to enable the fields, FALSE to disable them.
681: *
682: * Returns:
683: * VOID
684: \*****************************************************************************/
685:
686: PRIVATE VOID
687: SelectWindowEnableFields(
688: HWND hwnd,
689: BOOL fEnable
690: )
691: {
692: EnableWindow(GetDlgItem(hwnd, DID_SELWINLIST), fEnable);
693: EnableWindow(GetDlgItem(hwnd, DID_SELWINWINDOW), fEnable);
694: EnableWindow(GetDlgItem(hwnd, DID_SELWINCLASS), fEnable);
695: EnableWindow(GetDlgItem(hwnd, DID_SELWINPARENT), fEnable);
696: EnableWindow(GetDlgItem(hwnd, DID_SELWINRECT), fEnable);
697: EnableWindow(GetDlgItem(hwnd, DID_SELWINSTYLE), fEnable);
698: }
699:
700:
701:
702: /*****************************************************************************\
703: * OutputDlgProc
704: *
705: * Dialog proc for the Output dialog.
706: *
707: * Arguments:
708: * HWND hwnd - handle to the output dialog
709: * UINT msg - message sent to output dialog
710: * WPARAM wParam - message parameter.
711: * LPARAM lParam - message parameter.
712: *
713: * Returns:
714: * The value that the dialog proc should return, based on the processing
715: * of the specific WM_COMMAND message received.
716: *
717: \*****************************************************************************/
718:
719: BOOL CALLBACK
720: OutputDlgProc(
721: HWND hwnd,
722: UINT msg,
723: WPARAM wParam,
724: LPARAM lParam
725: )
726: {
727: switch (msg)
728: {
729: case WM_INITDIALOG:
730: CheckDlgButton(hwnd, DID_OUTPUTWINDOW, gfOutputWin);
731: CheckDlgButton(hwnd, DID_OUTPUTCOM1, gfOutputCom1);
732: CheckDlgButton(hwnd, DID_OUTPUTFILE, gfOutputFile);
733:
734: SetDlgItemText(hwnd, DID_OUTPUTFILENAME, gszFile);
735: SetDlgItemInt(hwnd, DID_OUTPUTLINES, gnLines, FALSE);
736:
737: return TRUE;
738:
739: case WM_COMMAND:
740: return OutputCommand(hwnd, LOWORD(wParam), HIWORD(wParam));
741: }
742:
743: return FALSE;
744: }
745:
746:
747:
748: /*****************************************************************************\
749: * OutputCommand
750: *
751: * Handles the WM_COMMAND messages for the Output dialog.
752: *
753: * Arguments:
754: * HWND hwnd - Window handle of the dialog.
755: * INT nCmd - Command value.
756: * INT nNotifyCode - The notify code.
757: *
758: * Returns:
759: * The value that the dialog proc should return, based on the processing
760: * of the specific WM_COMMAND message received.
761: *
762: \*****************************************************************************/
763:
764: PRIVATE BOOL
765: OutputCommand(
766: HWND hwnd,
767: INT nCmd,
768: INT nNotifyCode
769: )
770: {
771: HFILE fh;
772: INT i;
773: CHAR szTemp[MAXSTRING];
774:
775: switch (nCmd)
776: {
777: case IDOK:
778: i = GetDlgItemInt(hwnd, DID_OUTPUTLINES, &i, FALSE);
779: if (i != gnLines)
780: {
781: if ( i > 0 && i <= LINES_MAX)
782: {
783: gnLines = i;
784: MyCreatePrintfWin(ghwndSpyApp);
785: }
786: else
787: {
788: Message(MB_OK | MB_ICONEXCLAMATION,
789: "Window lines should be between 1-%d", LINES_MAX);
790: SetFocus(GetDlgItem(hwnd, DID_OUTPUTLINES));
791: break;
792: }
793: }
794:
795: gfOutputWin = IsDlgButtonChecked(hwnd, DID_OUTPUTWINDOW);
796: gfOutputCom1 = IsDlgButtonChecked(hwnd, DID_OUTPUTCOM1);
797: gfOutputFile = IsDlgButtonChecked(hwnd, DID_OUTPUTFILE);
798:
799: if (gfOutputFile)
800: {
801: GetDlgItemText(hwnd, DID_OUTPUTFILENAME, szTemp, MAXSTRING);
802: //BUGBUG verify that they entered a filename!
803: if (lstrcmp(gszFile, szTemp)) /* Not Equal */
804: {
805: fh = _lcreat(szTemp, 0);
806: if (fh == (HFILE)(-1))
807: {
808: if (Message(MB_OKCANCEL | MB_ICONEXCLAMATION,
809: "Cannot open %s", szTemp) == IDCANCEL)
810: {
811: EndDialog(hwnd, FALSE);
812: }
813:
814: return TRUE;
815: }
816:
817: lstrcpy(gszFile, szTemp);
818: if (gfhFile)
819: _lclose(gfhFile);
820: gfhFile = fh;
821: }
822: }
823: else
824: {
825: if (gfhFile)
826: {
827: _lclose(gfhFile);
828: gfhFile = 0;
829: }
830: }
831:
832: EndDialog(hwnd, TRUE);
833: return TRUE;
834:
835: case IDCANCEL:
836: EndDialog(hwnd, FALSE);
837: return TRUE;
838: }
839:
840: return FALSE;
841: }
842:
843:
844:
845: /*****************************************************************************\
846: * SelectFont
847: *
848: * Allows the user to select a new font for the display.
849: *
850: * Arguments:
851: * none
852: *
853: * Returns:
854: * VOID
855: \*****************************************************************************/
856:
857: VOID
858: SelectFont(
859: VOID
860: )
861: {
862: CHOOSEFONT cf;
863: LOGFONT lf;
864: HFONT hfontNew;
865:
866: GetObject(ghfontPrintf, sizeof(LOGFONT), (LPVOID)&lf);
867:
868: cf.lStructSize = sizeof(cf);
869: cf.hwndOwner = ghwndSpyApp;
870: cf.hDC = NULL;
871: cf.lpLogFont = &lf;
872: cf.iPointSize = 0;
873: cf.Flags = CF_ANSIONLY | CF_FORCEFONTEXIST | CF_INITTOLOGFONTSTRUCT
874: | CF_SCREENFONTS;
875: cf.rgbColors = 0;
876: cf.lCustData = 0;
877: cf.lpfnHook = NULL;
878: cf.lpTemplateName = NULL;
879: cf.hInstance = NULL;
880: cf.lpszStyle = NULL;
881: cf.nFontType = 0;
882: cf.nSizeMin = 0;
883: cf.nSizeMax = 0;
884:
885: if (ChooseFont(&cf))
886: {
887: if (hfontNew = CreateFontIndirect(&lf))
888: {
889: SetPrintfFont(ghwndPrintf, hfontNew);
890: ghfontPrintf = hfontNew;
891: }
892: }
893: }
894:
895:
896:
897: /*****************************************************************************\
898: * MessagesDlgProc
899: *
900: * Dialog proc for the Messages dialog. This dialog allows the user
901: * to select which messages they want to spy on.
902: *
903: * Arguments:
904: * HWND hwnd - handle to the dialog window.
905: * UINT msg - message to the window
906: * WPARAM wParam - message parameter
907: * LPARAM lParam - message parameter
908: *
909: * Returns:
910: * The value that the dialog proc should return, based on the processing
911: * of the specific WM_COMMAND message received.
912: \*****************************************************************************/
913:
914: BOOL CALLBACK
915: MessagesDlgProc(
916: HWND hwnd,
917: UINT msg,
918: WPARAM wParam,
919: LPARAM lParam
920: )
921: {
922: switch (msg)
923: {
924: case WM_INITDIALOG:
925: MessagesInit(hwnd);
926: return TRUE;
927:
928: case WM_COMMAND:
929: return MessagesCommand(hwnd, LOWORD(wParam), HIWORD(wParam));
930: }
931:
932: return FALSE;
933: }
934:
935:
936:
937: /*****************************************************************************\
938: * MessagesInit
939: *
940: * Initializes the messages dialog.
941: *
942: * Arguments:
943: * HWND hwnd - Dialog window handle.
944: *
945: * Returns:
946: * VOID
947: \*****************************************************************************/
948:
949: PRIVATE VOID
950: MessagesInit(
951: HWND hwnd
952: )
953: {
954: HWND hwndList;
955: INT i;
956: INT j;
957: INT iSel;
958: PMSGDESC pmd;
959:
960: for (j = 0; j < gcMsgGroups; j++)
961: gaMsgGroup[j].cUseCount = 0;
962:
963: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
964:
965: for (i = 0, pmd = gaMsgs; i < gcMessages; i++, pmd++)
966: {
967: iSel = (INT)SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)pmd->pszMsg);
968: SendMessage(hwndList, LB_SETITEMDATA, iSel, (LPARAM)pmd);
969:
970: if (pmd->Flags & MTF_SELECTED)
971: {
972: SendMessage(hwndList, LB_SETSEL, TRUE, iSel);
973:
974: for (j = 0; j < gcMsgGroups; j++)
975: {
976: if (gaMsgGroup[j].flMask & pmd->Flags)
977: gaMsgGroup[j].cUseCount++;
978: }
979: }
980: }
981:
982: //
983: // Set the selection rectangle to the first item in the listbox.
984: //
985: SendMessage(hwndList, LB_SETCARETINDEX, 0, FALSE);
986:
987: //
988: // Loop through all the message groups.
989: //
990: for (j = 0; j < gcMsgGroups; j++)
991: {
992: //
993: // Is at least one message in the group selected?
994: //
995: if (gaMsgGroup[j].cUseCount)
996: {
997: //
998: // Check the corresponding checkbox. If all messages
999: // in the group are selected, the checkbox is checked.
1000: // If only some are selected, the checkbox is set to
1001: // grayed (3-state).
1002: //
1003: CheckDlgButton(hwnd, gaMsgGroup[j].idCheckBox,
1004: (gaMsgGroup[j].cUseCount == gaMsgGroup[j].cMsgs) ? 1 : 2);
1005: }
1006: }
1007:
1008: if (gfMsgsUser)
1009: CheckDlgButton(hwnd, DID_MSGSUSER, 1);
1010:
1011: if (gfMsgsUnknown)
1012: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 1);
1013:
1014: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS,
1015: gcMessages, (LPARAM)gaiSelected);
1016: }
1017:
1018:
1019:
1020: /*****************************************************************************\
1021: * MessagesCommand
1022: *
1023: * Handles the WM_COMMAND messages for the Messages dialog.
1024: *
1025: * Arguments:
1026: * HWND hwnd - Window handle of the dialog.
1027: * INT nCmd - Command value.
1028: * INT nNotifyCode - The notify code.
1029: *
1030: * Returns:
1031: * The value that the dialog proc should return, based on the processing
1032: * of the specific WM_COMMAND message received.
1033: *
1034: \*****************************************************************************/
1035:
1036: PRIVATE BOOL
1037: MessagesCommand(
1038: HWND hwnd,
1039: INT nCmd,
1040: INT nNotifyCode
1041: )
1042: {
1043: INT i;
1044: INT j;
1045: PMSGGROUP pmg;
1046: PMSGDESC pmd;
1047: BOOL fChecked;
1048: HWND hwndList;
1049: INT cItems;
1050: BOOL fSel;
1051: INT iSel;
1052: INT cSelItemsMax;
1053: INT iTopIndex;
1054:
1055: switch (nCmd)
1056: {
1057: case DID_MSGSLIST:
1058: if (nNotifyCode == LBN_SELCHANGE)
1059: {
1060: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
1061: cItems = SendMessage(hwndList, LB_GETSELITEMS,
1062: gcMessages, (LPARAM)gaiSelected2);
1063: if (cItems == gcItemsSave)
1064: {
1065: //
1066: // Nothing changed except for the selection
1067: // rectangle moving. We are done.
1068: //
1069: break;
1070: }
1071:
1072: if (cItems > gcItemsSave)
1073: {
1074: //
1075: // A message was selected. Look for it.
1076: //
1077: for (i = 0; i < gcItemsSave &&
1078: gaiSelected[i] == gaiSelected2[i]; i++)
1079: ;
1080:
1081: iSel = gaiSelected2[i];
1082: fSel = TRUE;
1083: }
1084: else
1085: {
1086: //
1087: // A message was unselected. Look for it.
1088: //
1089: for (i = 0; i < cItems &&
1090: gaiSelected[i] == gaiSelected2[i]; i++)
1091: ;
1092:
1093: iSel = gaiSelected[i];
1094: fSel = FALSE;
1095: }
1096:
1097: //
1098: // Get the currently selected item. It was either
1099: // just turned on or off.
1100: //
1101: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, iSel, 0);
1102:
1103: //
1104: // Loop through the message groups and update the use
1105: // counts for all groups that contain this message.
1106: //
1107: for (i = 0; i < gcMsgGroups; i++)
1108: {
1109: if (pmd->Flags & gaMsgGroup[i].flMask)
1110: {
1111: gaMsgGroup[i].cUseCount += fSel ? 1 : -1;
1112: }
1113: }
1114:
1115: //
1116: // Be sure that the checkboxes reflect the updated
1117: // status of the message group use counts.
1118: //
1119: MessagesUpdateCheckBoxes(hwnd);
1120:
1121: //
1122: // Save away the new selected item array.
1123: //
1124: cSelItemsMax = max(cItems, gcItemsSave);
1125: for (i = 0; i < cSelItemsMax; i++)
1126: {
1127: gaiSelected[i] = gaiSelected2[i];
1128: }
1129:
1130: gcItemsSave = cItems;
1131: }
1132:
1133: break;
1134:
1135: case DID_MSGSALL:
1136: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
1137: SendMessage(hwndList, LB_SETSEL, TRUE, (LPARAM)-1);
1138:
1139: for (i = 0; i < gcMsgGroups; i++)
1140: {
1141: gaMsgGroup[i].cUseCount = gaMsgGroup[i].cMsgs;
1142: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, 1);
1143: }
1144:
1145: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS, gcMessages,
1146: (LPARAM)gaiSelected);
1147:
1148: CheckDlgButton(hwnd, DID_MSGSUSER, 1);
1149: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 1);
1150:
1151: break;
1152:
1153: case DID_MSGSNONE:
1154: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
1155: SendMessage(hwndList, LB_SETSEL, FALSE, (LPARAM)-1);
1156:
1157: for (i = 0; i < gcMsgGroups; i++)
1158: {
1159: gaMsgGroup[i].cUseCount = 0;
1160: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, 0);
1161: }
1162:
1163: gcItemsSave = 0;
1164:
1165: CheckDlgButton(hwnd, DID_MSGSUSER, 0);
1166: CheckDlgButton(hwnd, DID_MSGSUNKNOWN, 0);
1167:
1168: break;
1169:
1170: case DID_MSGSDDE:
1171: case DID_MSGSCLIP:
1172: case DID_MSGSMOUSE:
1173: case DID_MSGSNC:
1174: case DID_MSGSKEYBD:
1175: case DID_MSGSBM:
1176: case DID_MSGSCB:
1177: case DID_MSGSEM:
1178: case DID_MSGSLB:
1179: case DID_MSGSSTM:
1180: for (i = 0; i < gcMsgGroups; i++)
1181: {
1182: if (gaMsgGroup[i].idCheckBox == nCmd)
1183: {
1184: pmg = &gaMsgGroup[i];
1185: break;
1186: }
1187: }
1188:
1189: fChecked = IsDlgButtonChecked(hwnd, pmg->idCheckBox);
1190: if (fChecked == 1)
1191: fChecked = FALSE;
1192: else
1193: fChecked = TRUE;
1194:
1195: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
1196:
1197: if (fChecked)
1198: {
1199: SendMessage(hwndList, WM_SETREDRAW, FALSE, 0);
1200: iTopIndex = SendMessage(hwndList, LB_GETTOPINDEX, 0, 0);
1201: }
1202:
1203: //
1204: // Get the list of currently selected items.
1205: //
1206: cItems = SendMessage(hwndList, LB_GETSELITEMS,
1207: gcMessages, (LPARAM)gaiSelected);
1208:
1209: //
1210: // Look for all the messages in this group.
1211: //
1212: for (i = 0, iSel = 0; i < gcMessages; i++)
1213: {
1214: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA, i, 0);
1215: if (pmd->Flags & pmg->flMask)
1216: {
1217: //
1218: // Bump up through the list of selected items, looking
1219: // to see if this item is currently selected.
1220: //
1221: for (fSel = FALSE; iSel < cItems &&
1222: gaiSelected[iSel] <= i; iSel++)
1223: {
1224: //
1225: // A match was found. The item is selected.
1226: //
1227: if(gaiSelected[iSel] == i)
1228: {
1229: fSel = TRUE;
1230: break;
1231: }
1232: }
1233:
1234: //
1235: // Is the current selection state of the item
1236: // different from the desired selection state?
1237: //
1238: if (fSel != fChecked)
1239: {
1240: //
1241: // Update the use counts of all groups that contain
1242: // this message.
1243: //
1244: for (j = 0; j < gcMsgGroups; j++)
1245: {
1246: if (pmd->Flags & gaMsgGroup[j].flMask)
1247: {
1248: gaMsgGroup[j].cUseCount += fChecked ? 1 : -1;
1249: }
1250: }
1251:
1252: //
1253: // Select/deselect the message in the list box.
1254: //
1255: SendMessage(hwndList, LB_SETSEL, fChecked, i);
1256: }
1257: }
1258: }
1259:
1260: //
1261: // Be sure that the checkboxes reflect the updated
1262: // status of the message group use counts.
1263: //
1264: MessagesUpdateCheckBoxes(hwnd);
1265:
1266: if (fChecked)
1267: {
1268: SendMessage(hwndList, LB_SETTOPINDEX, iTopIndex, 0);
1269: SendMessage(hwndList, WM_SETREDRAW, TRUE, 0);
1270: InvalidateRect(hwndList, NULL, FALSE);
1271: }
1272:
1273: gcItemsSave = SendMessage(hwndList, LB_GETSELITEMS,
1274: gcMessages, (LPARAM)gaiSelected);
1275:
1276: break;
1277:
1278: case IDOK:
1279: hwndList = GetDlgItem(hwnd, DID_MSGSLIST);
1280: cItems = SendMessage(hwndList, LB_GETSELITEMS,
1281: gcMessages, (LPARAM)gaiSelected);
1282:
1283: //
1284: // Unselect all messages.
1285: //
1286: for (i = 0; i < gcMessages; i++)
1287: gaMsgs[i].Flags &= ~MTF_SELECTED;
1288:
1289: //
1290: // Mark all the messages that are selected.
1291: //
1292: for (i = 0; i < cItems; i++)
1293: {
1294: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA,
1295: gaiSelected[i], 0);
1296: pmd->Flags |= MTF_SELECTED;
1297: }
1298:
1299: if (IsDlgButtonChecked(hwnd, DID_MSGSUSER))
1300: gfMsgsUser = TRUE;
1301: else
1302: gfMsgsUser = FALSE;
1303:
1304: if (IsDlgButtonChecked(hwnd, DID_MSGSUNKNOWN))
1305: gfMsgsUnknown = TRUE;
1306: else
1307: gfMsgsUnknown = FALSE;
1308:
1309: #if 0 //Debug code!
1310: for (i = 0; i < gcMsgGroups; i++)
1311: {
1312: iSel = 0;
1313: for (j = 0; j < cItems; j++)
1314: {
1315: pmd = (PMSGDESC)SendMessage(hwndList, LB_GETITEMDATA,
1316: gaiSelected[j], 0);
1317: if (pmd->Flags & gaMsgGroup[i].flMask)
1318: iSel++;
1319: }
1320:
1321: if (iSel != gaMsgGroup[i].cUseCount)
1322: {
1323: DbgPrintf("Use counts are wrong!!!");
1324: for (j = 0; j < gcMsgGroups; j++)
1325: {
1326: DbgPrintf("cMsgs:%d Use:%d", gaMsgGroup[j].cMsgs, gaMsgGroup[j].cUseCount);
1327: }
1328: }
1329: }
1330: #endif // end debug code
1331:
1332: EndDialog(hwnd, IDOK);
1333: return TRUE;
1334:
1335: case IDCANCEL:
1336: EndDialog(hwnd, IDCANCEL);
1337: return TRUE;
1338: }
1339:
1340: return FALSE;
1341: }
1342:
1343:
1344:
1345: /*****************************************************************************\
1346: * MessagesUpdateCheckBoxes
1347: *
1348: * Updates the message group checkboxes in the Messages dialog.
1349: * This routine should be called when the use counts in the
1350: * message group table are changed, so that the state of the
1351: * checkboxes will get updated also.
1352: *
1353: * Arguments:
1354: * HWND hwnd - Dialog window handle.
1355: *
1356: * Returns:
1357: * VOID
1358: \*****************************************************************************/
1359:
1360: PRIVATE VOID
1361: MessagesUpdateCheckBoxes(
1362: HWND hwnd
1363: )
1364: {
1365: INT i;
1366: INT fState;
1367:
1368: for (i = 0; i < gcMsgGroups; i++)
1369: {
1370: if (gaMsgGroup[i].cUseCount == gaMsgGroup[i].cMsgs)
1371: fState = 1;
1372: else if (gaMsgGroup[i].cUseCount == 0)
1373: fState = 0;
1374: else
1375: fState = 2;
1376:
1377: CheckDlgButton(hwnd, gaMsgGroup[i].idCheckBox, fState);
1378: }
1379: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.