Annotation of pmsdk/samples/spy/window.c, revision 1.1

1.1     ! root        1: /***************************************************************************\
        !             2: * window.c - Spy Window dialog functions
        !             3: *
        !             4: * Created by Microsoft Corporation, 1989
        !             5: \***************************************************************************/
        !             6: 
        !             7: #define        INCL_WINDIALOGS
        !             8: #define        INCL_WINHEAP                    /* needed for spy.h */
        !             9: #define        INCL_WININPUT
        !            10: #define        INCL_WINLISTBOXES
        !            11: #define        INCL_WINMESSAGEMGR
        !            12: #define        INCL_WINPOINTERS                /* needed for spy.h */
        !            13: #define        INCL_WINWINDOWMGR
        !            14: #include <os2.h>
        !            15: #include <stdio.h>
        !            16: #include <string.h>
        !            17: #include "spy.h"
        !            18: #include <spyhook.h>
        !            19: #include <time.h>
        !            20: #include <stdlib.h>
        !            21: 
        !            22: 
        !            23: /* Forward Declarations */
        !            24: void    InitWindowList(HWND, HWND, int);
        !            25: void    BuildWindowWatchList(void);
        !            26: void    DisplayWindowInfo(HWND, HWND);
        !            27: void    SelectWindowFromText(HWND);
        !            28: SHORT   DumpWindowInfo(HWND, SHORT);
        !            29: int cdecl    CompareHwnds(const void *, const void *);
        !            30: MRESULT        CALLBACK SpyWindowsDlgProc(HWND, USHORT, MPARAM, MPARAM);
        !            31: 
        !            32: 
        !            33: 
        !            34: 
        !            35: /***************************************************************************\
        !            36: * MRESULT CALLBACK SpyWindowsDlgProc(hwnd, msg, mp1, mp2)
        !            37: *
        !            38: * The Spy Windows Dialog procedure
        !            39: \***************************************************************************/
        !            40: MRESULT CALLBACK SpyWindowsDlgProc(hwnd, msg, mp1, mp2)
        !            41: HWND hwnd;
        !            42: USHORT msg;
        !            43: MPARAM mp1;
        !            44: MPARAM mp2;
        !            45: {
        !            46:     BOOL        fSelect = TRUE;
        !            47:     SHORT       cWindows;
        !            48:     HWND        hwndPoint;
        !            49:     HWND        hwndItem;   /* from handle of list item */
        !            50:     USHORT      iItemFocus; /* Index to item that has the focus */
        !            51: 
        !            52:     switch (msg) {
        !            53: 
        !            54:     case WM_INITDLG:
        !            55:         /* Initialize the dialog items */
        !            56:         hwndWindowLB = WinWindowFromID(hwnd, DID_WINDOWLIST);
        !            57:         InitWindowList(hwnd, HWND_DESKTOP, 0);
        !            58:         InitWindowList(hwnd, HWND_OBJECT, -10);
        !            59:         hwndWinDlgDisp = NULL;
        !            60:         fTrackingListBox = TRUE;
        !            61:         break;
        !            62: 
        !            63:     case WM_CHAR:
        !            64:         /*
        !            65:          * Handle VK_ENTER and VK_NEWLINE if our Edit control has
        !            66:          * the focus and it is a keydown
        !            67:          */
        !            68:         if (!(SHORT1FROMMP(mp1) & KC_KEYUP) &&
        !            69:                 (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
        !            70:                 ( (SHORT2FROMMP(mp2) == VK_ENTER) ||
        !            71:                   (SHORT2FROMMP(mp2) == VK_NEWLINE) )) {
        !            72: 
        !            73: 
        !            74:             if (WinQueryFocus(HWND_DESKTOP, FALSE) ==
        !            75:                     WinWindowFromID(hwnd, DID_WHANDLE)) {
        !            76:                 SelectWindowFromText(hwnd);
        !            77:                 break;
        !            78:             }
        !            79:         }
        !            80: 
        !            81:         /* Normaly pass to dialog procedure to handle message */
        !            82:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
        !            83:         break;
        !            84: 
        !            85:     case WM_COMMAND:
        !            86:         switch (SHORT1FROMMP(mp1)) {
        !            87:         case DID_OK:
        !            88:             BuildWindowWatchList();
        !            89:         case DID_CANCEL:
        !            90:             /* Now dismiss the dialog */
        !            91:             WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
        !            92:             break;
        !            93:         case DID_WUNSELALL:
        !            94:             fSelect = FALSE;
        !            95:         case DID_WSELALL:
        !            96:             cWindows = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
        !            97:                 0L, 0L);
        !            98: 
        !            99:             fTrackingListBox = FALSE;
        !           100:             while (cWindows) {
        !           101:                 /* Loop through all windows, selecting or unselcting all */
        !           102:                 WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)--cWindows,
        !           103:                     (MPARAM)fSelect);
        !           104:             }
        !           105:             fTrackingListBox = TRUE;
        !           106:             break;
        !           107: 
        !           108:         case DID_WSELMOUSE:
        !           109:             /* Call function to track mouse, returns window handle */
        !           110:             hwndPoint = HwndSelWinWithMouse(hwnd, DisplayWindowInfo);
        !           111:             if (hwndPoint == NULL)
        !           112:         break;    /* No window to process */
        !           113: 
        !           114:             /*
        !           115:              * Now find the window in the list, Make the item visible
        !           116:              * and set the item as selected.
        !           117:              */
        !           118:             cWindows = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
        !           119:                     0L, 0L);
        !           120: 
        !           121:             while (cWindows) {
        !           122:                 /*
        !           123:                  * Loop through all windows until we wind the right
        !           124:                  * one with the correct window handle
        !           125:                  */
        !           126:                 hwndItem = (HWND)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
        !           127:                         (MPARAM)--cWindows, 0L);
        !           128: 
        !           129:                 if (hwndItem == hwndPoint) {
        !           130:                     /* found the right item, move it to top */
        !           131:                     WinSendMsg(hwndWindowLB, LM_SETTOPINDEX, (MPARAM)cWindows, 0L);
        !           132:                     WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)cWindows,
        !           133:                             (MPARAM)TRUE);
        !           134:                     break;
        !           135:                 }
        !           136:             }
        !           137:             break;
        !           138: 
        !           139:         }
        !           140:         break;
        !           141: 
        !           142: 
        !           143:     default:
        !           144:         /*
        !           145:          * Default is to see if the listbox has changed its focus
        !           146:          * item number.  If it has, then we want to display the information
        !           147:          * about the window that the listbox cursor is over.  There is no
        !           148:          * legal way to do this, One approach appears to temporary set the
        !           149:          * listbox to be a single selection listbox, then query its selection
        !           150:          * and set it back into multiple selection mode.
        !           151:          */
        !           152:         if (fTrackingListBox && hwndWindowLB != NULL) {
        !           153: 
        !           154:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, 0L, LS_MULTIPLESEL);
        !           155:             iItemFocus = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
        !           156:                     (MPARAM)LIT_FIRST, 0L);
        !           157:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, LS_MULTIPLESEL,
        !           158:                     LS_MULTIPLESEL);
        !           159: 
        !           160:             if (iItemFocus != iCurItemFocus) {
        !           161:                 iCurItemFocus = iItemFocus;
        !           162:                 if (iItemFocus != (USHORT)-1) {
        !           163: 
        !           164:                     hwndItem = (HWND)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
        !           165:                             (MPARAM)iItemFocus, 0L);
        !           166:                     DisplayWindowInfo(hwnd, hwndItem);
        !           167:                 }
        !           168:             }
        !           169:         }
        !           170:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
        !           171:     }
        !           172:     return 0L;
        !           173: }
        !           174: 
        !           175: 
        !           176: 
        !           177: 
        !           178: /***************************************************************************\
        !           179: * void SelectWindowFromText(hwndDlg)
        !           180: *
        !           181: *   Updates the text that is displayed in the message text line
        !           182: \***************************************************************************/
        !           183: void SelectWindowFromText(hwndDlg)
        !           184: HWND    hwndDlg;
        !           185: {
        !           186:     char    szTemp[80];
        !           187:     HWND    hwndSelect;
        !           188:     SHORT   cItems;
        !           189:     SHORT   i;
        !           190: 
        !           191: 
        !           192:     /* First get the edit text from the string */
        !           193:     WinQueryDlgItemText(hwndDlg, DID_WHANDLE, sizeof(szTemp),
        !           194:             (PSZ)szTemp);
        !           195: 
        !           196:     hwndSelect = (HWND)UConvertStringToNum(szTemp);
        !           197: 
        !           198:     cItems = (SHORT)WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
        !           199:             0L, 0L);
        !           200: 
        !           201:     for (i=0; i < cItems; i++) {
        !           202:         if ((HWND)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
        !           203:                 (MPARAM)i, 0L) == hwndSelect)
        !           204:             break;  /* found it */
        !           205:     }
        !           206: 
        !           207:     if (i < cItems) {
        !           208:         /*
        !           209:          * found the hwnd, bring to top, and select it
        !           210:          */
        !           211:         WinSendMsg(hwndWindowLB, LM_SETTOPINDEX,
        !           212:                 MPFROMSHORT(i),  (MPARAM)0L);
        !           213: 
        !           214:         /* Always set it on */
        !           215:         WinSendMsg(hwndWindowLB, LM_SELECTITEM,
        !           216:                 MPFROMSHORT(i), MPFROMSHORT(TRUE));
        !           217: 
        !           218:     } else {
        !           219:         WinAlarm(HWND_DESKTOP, WA_WARNING);
        !           220:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)"");
        !           221:     }
        !           222: 
        !           223: }
        !           224: 
        !           225: 
        !           226: /****************************************************************************\
        !           227: * InitWindowList (hwndDialog, hwnd, level)
        !           228: *
        !           229: * Builds the list of windows displayed in the windows dialog
        !           230: \***************************************************************************/
        !           231: void InitWindowList(hwndDialog, hwnd, level)
        !           232: HWND    hwndDialog;
        !           233: HWND    hwnd;
        !           234: int     level;
        !           235: {
        !           236:     char    szTemp[30];
        !           237:     char    szId[20];
        !           238:     HWND    hwndT;
        !           239:     USHORT  item;
        !           240:     USHORT  id;
        !           241:     int     i;
        !           242: 
        !           243:     /*
        !           244:      * We will first add this item to our list of
        !           245:      * items in the listbox, If the item is in our list of hwnds,
        !           246:      * set the item selected. To keep from getting into endless loops
        !           247:      * will not add spywindow client, and descendants.
        !           248:      */
        !           249:     if (hwnd != hwndSpy) {
        !           250:         id = (USHORT)WinQueryWindowUShort(hwnd, QWS_ID);
        !           251:         sprintf(szId, "ID: %x", id);
        !           252: 
        !           253:         for (i = 0; i < cToName; i++) {
        !           254:             if (id == rgidtoname[i].id) {
        !           255:                 strcpy (szId, rgidtoname[i].szIdName);
        !           256:                 break;
        !           257:             }
        !           258:         }
        !           259: 
        !           260:         sprintf(szTemp, "%04x(%d) - %s", (USHORT)hwnd, level, szId);
        !           261:         item = (USHORT)WinSendMsg(hwndWindowLB, LM_INSERTITEM,
        !           262:                 (MPARAM)LIT_END, (MPARAM)(PSZ)szTemp);
        !           263: 
        !           264:         /* Set the item handle to the handle of the window */
        !           265:         WinSendMsg(hwndWindowLB, LM_SETITEMHANDLE, (MPARAM)item,
        !           266:                 (MPARAM)hwnd);
        !           267: 
        !           268:         if (SpyFWindowInList(hwnd, TRUE))
        !           269:             WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)item,
        !           270:                 (MPARAM)TRUE);
        !           271: 
        !           272:         /*
        !           273:          * Then we recurse with all of our children
        !           274:          */
        !           275:         if ((hwndT = WinQueryWindow(hwnd, QW_TOP, FALSE)) != NULL)
        !           276:             InitWindowList(hwndDialog, hwndT, level+1);
        !           277:     }
        !           278: 
        !           279:     /*
        !           280:      * Then go to our next sibling
        !           281:      */
        !           282:     if ((hwndT = WinQueryWindow(hwnd, QW_NEXT, FALSE)) != NULL)
        !           283:         InitWindowList(hwndDialog, hwndT, level);
        !           284: }
        !           285: 
        !           286: 
        !           287: 
        !           288: /***************************************************************************\
        !           289: * BuildWindowWatchList()
        !           290: *
        !           291: * Updates the list of windows to be watched from the listbox
        !           292: \***************************************************************************/
        !           293: void BuildWindowWatchList(void)
        !           294: {
        !           295: 
        !           296:     USHORT  itemPrevious;
        !           297:     USHORT  item;
        !           298:     HWND    hwnd;
        !           299: 
        !           300:     SHORT   chwnd;
        !           301:     HWND    rghwnd[MAXHWNDS];
        !           302: 
        !           303:     /*
        !           304:      * Simply loop through asking for the next selected item in the
        !           305:      * list.  Make sure not to overrun our list.
        !           306:      */
        !           307:     itemPrevious = (USHORT)LIT_FIRST;
        !           308:     chwnd = 0;
        !           309: 
        !           310:     while ((item = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
        !           311:             (MPARAM)itemPrevious, 0L)) != (USHORT)LIT_NONE) {
        !           312:         /*
        !           313:          * Get the items handle, which has the value of the window handle
        !           314:          */
        !           315:         hwnd = (HWND)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
        !           316:                 (MPARAM)item, 0L);
        !           317: 
        !           318:         rghwnd[chwnd++] = hwnd;
        !           319:         if (chwnd >= MAXHWNDS)
        !           320:             break;  /* Dont overflow array */
        !           321:         itemPrevious = item;    /* Where to cointinue the search */
        !           322:     }
        !           323: 
        !           324:     SpySetWindowList (chwnd, rghwnd);
        !           325: }
        !           326: 
        !           327: 
        !           328: /***************************************************************************\
        !           329: * HWND HwndSelWinWithMouse(HWND hwnd, void (*pfnDisplayInfo)(HWND, HWND))
        !           330: *
        !           331: *          This function is used to allow the user to select a window with
        !           332: *           the mouse.  If fDisplayInfo is TRUE, it will update the
        !           333: *           information in the dialog box, about the window that the
        !           334: *           mouse is currently over.
        !           335: \***************************************************************************/
        !           336: HWND HwndSelWinWithMouse(hwnd, pfnDisplayInfo)
        !           337: HWND hwnd;
        !           338: void (*pfnDisplayInfo)(HWND, HWND);
        !           339: {
        !           340: 
        !           341:     QMSG        qmsg;
        !           342:     HWND        hwndPoint;
        !           343:     char        szClassName[50];    /* Class name of window */
        !           344:     CLASSINFO   classinfo;          /* Information about class */
        !           345: 
        !           346: 
        !           347:     /*
        !           348:      * First set the capture to the specified window
        !           349:      */
        !           350:     WinSetCapture(HWND_DESKTOP, hwnd);
        !           351:     WinSetPointer (HWND_DESKTOP, hptrSelWin);
        !           352: 
        !           353:     /*
        !           354:      * Now loop through all of the messages that are sent, until
        !           355:      * we get our mouse 1 down message.  We will also filter out
        !           356:      * the WM_MOVE message, else we will dispatch the messages.
        !           357:      */
        !           358:     while (WinGetMsg(hab, &qmsg, NULL, 0, 0)) {
        !           359:         if (qmsg.msg == WM_MOUSEMOVE) {
        !           360:             if (pfnDisplayInfo != NULL) {
        !           361:                 hwndPoint = WinWindowFromPoint(HWND_DESKTOP,
        !           362:                     &qmsg.ptl, TRUE, FALSE);
        !           363:                 (*pfnDisplayInfo)(hwnd, hwndPoint);
        !           364:             }
        !           365:         }
        !           366:         else if (qmsg.msg == WM_BUTTON1DOWN)
        !           367:             break;
        !           368:         else
        !           369:             WinDispatchMsg(hab, &qmsg);
        !           370:     }
        !           371: 
        !           372:     WinSetPointer (HWND_DESKTOP, hptrArrow);
        !           373:     WinSetCapture(HWND_DESKTOP, NULL);
        !           374: 
        !           375: 
        !           376:     /*
        !           377:      * Map the point to the window,  If the CTRL-Key is down,
        !           378:      * we will go up through the parent chain until we get to
        !           379:      * a frame window or desktop.  Dont let hwndSpy through!!!
        !           380:      */
        !           381:     hwndPoint = WinWindowFromPoint(HWND_DESKTOP,
        !           382:         &qmsg.ptl, TRUE, FALSE);
        !           383:     if (WinGetKeyState(HWND_DESKTOP, VK_CTRL) & 0x8000) {
        !           384:         /* Asked for frame window */
        !           385:         for (;;) {
        !           386:             if (hwndPoint == NULL)
        !           387:                 return (NULL);         /* No frames available */
        !           388:             /* See if frame class */
        !           389:             WinQueryClassName(hwndPoint, sizeof(szClassName),
        !           390:                 (PSZ)szClassName);
        !           391:             if (WinQueryClassInfo(hab, (PSZ)szClassName, &classinfo) &&
        !           392:                     (classinfo.flClassStyle & CS_FRAME))
        !           393:                 break;  /* We have our frame */
        !           394: 
        !           395:             /* Not frame, go back to parent */
        !           396:             hwndPoint = WinQueryWindow(hwndPoint, QW_PARENT, FALSE);
        !           397:         }
        !           398:     }
        !           399: 
        !           400:     if (pfnDisplayInfo != NULL)
        !           401:         (*pfnDisplayInfo)(hwnd, hwndPoint);
        !           402: 
        !           403:     if (WinIsChild(hwndPoint, hwndSpy))
        !           404:         return (NULL);    /* Dont want to get in endless loops */
        !           405: 
        !           406:     return (hwndPoint);
        !           407: }
        !           408: 
        !           409: 
        !           410: 
        !           411: /***************************************************************************\
        !           412: * DisplayWindowInfo(HWND hwndDialog, HWND hwnd)
        !           413: *
        !           414: * Displays the information about the selected window in the dialog
        !           415: \***************************************************************************/
        !           416: void DisplayWindowInfo(hwndDlg, hwnd)
        !           417: HWND            hwndDlg;
        !           418: HWND            hwnd;
        !           419: {
        !           420:     HWND        hwndT;
        !           421:     HWND        hwndParent;
        !           422:     char        szTemp[50];
        !           423:     char        szTemp2[10];
        !           424:     CLASSINFO   classinfo;
        !           425:     RECTL       rcl;
        !           426:     USHORT      id;
        !           427:     ULONG       ul;
        !           428:     USHORT      us1;
        !           429:     USHORT      us2;
        !           430:     USHORT      us3;
        !           431:     USHORT      us4;
        !           432:     PID         pidWindow;
        !           433:     TID         tidWindow;
        !           434: 
        !           435: 
        !           436:     if (hwnd != hwndWinDlgDisp)
        !           437:     {
        !           438:         hwndWinDlgDisp = hwnd;
        !           439: 
        !           440:         /* This could be table driven */
        !           441:         sprintf(szTemp, "0x%04x", (SHORT)hwnd);
        !           442:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)szTemp);
        !           443: 
        !           444:         WinQueryClassName(hwnd, sizeof(szTemp), (PSZ)szTemp);
        !           445:         if (!WinQueryClassInfo(hab, (PSZ)szTemp, &classinfo)) {
        !           446:             classinfo.flClassStyle = -1;    /* Let know error conditon */
        !           447:             classinfo.cbWindowData = 0;     /* Make sure we dont dump */
        !           448:         }
        !           449: 
        !           450:         WinSetDlgItemText(hwndDlg, DID_WCLASS, (PSZ)szTemp);
        !           451: 
        !           452: 
        !           453:         /*
        !           454:          * Warning, we only query the text if the window is not an object
        !           455:          * window.  If it is an object window, the message queue may not
        !           456:          * be processing messages, which could hang us
        !           457:          */
        !           458:         if (WinIsChild(hwnd, HWND_OBJECT))
        !           459:             szTemp[0] = '\0';   /* No text available */
        !           460:         else
        !           461:             WinQueryWindowText(hwnd, sizeof(szTemp), (PSZ)szTemp);
        !           462:         WinSetDlgItemText(hwndDlg, DID_WTEXT, (PSZ)szTemp);
        !           463: 
        !           464:         hwndParent = WinQueryWindow(hwnd, QW_PARENT, FALSE);
        !           465:         sprintf(szTemp, "0x%04x", (SHORT)hwndParent);
        !           466:         WinSetDlgItemText(hwndDlg, DID_WPARENT, (PSZ)szTemp);
        !           467: 
        !           468:         hwndT = WinQueryWindow(hwnd, QW_TOP, FALSE);
        !           469:         sprintf(szTemp, "0x%04x", (SHORT)hwndT);
        !           470:         WinSetDlgItemText(hwndDlg, DID_WCHILD, (PSZ)szTemp);
        !           471: 
        !           472:         hwndT = WinQueryWindow(hwnd, QW_OWNER, FALSE);
        !           473:         sprintf(szTemp, "0x%04x", (SHORT)hwndT);
        !           474:         WinSetDlgItemText(hwndDlg, DID_WOWNER, (PSZ)szTemp);
        !           475: 
        !           476:         WinQueryWindowRect(hwnd, &rcl);
        !           477:         WinMapWindowPoints(hwnd, hwndParent, (PPOINTL)&rcl, 2);
        !           478:         sprintf(szTemp, "(%d, %d), (%d, %d)", (SHORT)rcl.xLeft,
        !           479:             (SHORT)rcl.yBottom, (SHORT)rcl.xRight, (SHORT)rcl.yTop);
        !           480:         WinSetDlgItemText(hwndDlg, DID_WRECT, (PSZ)szTemp);
        !           481: 
        !           482:         id = (USHORT)WinQueryWindowUShort(hwnd, QWS_ID);
        !           483:         sprintf(szTemp, "0x%04x", id);
        !           484:         WinSetDlgItemText(hwndDlg, DID_WID, (PSZ)szTemp);
        !           485: 
        !           486:         ul = (ULONG)WinQueryWindowULong(hwnd, QWL_STYLE);
        !           487:         sprintf(szTemp, "0x%08lx", ul);
        !           488:         WinSetDlgItemText(hwndDlg, DID_WSTYLE, (PSZ)szTemp);
        !           489: 
        !           490:         sprintf(szTemp, "0x%08lx", classinfo.flClassStyle);
        !           491:         WinSetDlgItemText(hwndDlg, DID_WCSTYLE, (PSZ)szTemp);
        !           492: 
        !           493:         ul = (ULONG)WinQueryWindowULong(hwnd, QWP_PFNWP);
        !           494:         sprintf(szTemp, "%p", ul);
        !           495:         WinSetDlgItemText(hwndDlg, DID_WPFNWP, (PSZ)szTemp);
        !           496: 
        !           497:         ul = (ULONG)WinQueryWindowULong(hwnd, QWL_HMQ);
        !           498:         sprintf(szTemp, "0x%04x", (SHORT)ul);
        !           499:         WinSetDlgItemText(hwndDlg, DID_WHMQ, (PSZ)szTemp);
        !           500: 
        !           501:         WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
        !           502:         sprintf(szTemp, "%d", (SHORT)pidWindow);
        !           503:         WinSetDlgItemText(hwndDlg, DID_WPID, (PSZ)szTemp);
        !           504:         sprintf(szTemp, "%d", (SHORT)tidWindow);
        !           505:         WinSetDlgItemText(hwndDlg, DID_WTID, (PSZ)szTemp);
        !           506: 
        !           507:         /*
        !           508:          * We have four General purpose lines left, used only for
        !           509:          * frames now
        !           510:          */
        !           511:         if ((classinfo.flClassStyle & CS_FRAME) &&
        !           512:                     (classinfo.cbWindowData > QWL_HWNDFOCUSSAVE)) {
        !           513:             ul = (ULONG)WinQueryWindowULong(hwnd, QWL_HWNDFOCUSSAVE);
        !           514:             sprintf(szTemp, "Frame Focus: %p",ul);
        !           515:             WinSetDlgItemText(hwndDlg, DID_WOLINE1, (PSZ)szTemp);
        !           516: 
        !           517:             us1 = (USHORT)WinQueryWindowUShort(hwnd, QWS_FLAGS);
        !           518:             us2 = (USHORT)WinQueryWindowUShort(hwnd, QWS_RESULT);
        !           519:             sprintf(szTemp, "Flags: 0x%04x Rslt: 0x%04x", us1, us2);
        !           520:             WinSetDlgItemText(hwndDlg, DID_WOLINE2, (PSZ)szTemp);
        !           521: 
        !           522:             us1 = (USHORT)WinQueryWindowUShort(hwnd, QWS_XRESTORE);
        !           523:             us2 = (USHORT)WinQueryWindowUShort(hwnd, QWS_YRESTORE);
        !           524:             us3 = (USHORT)WinQueryWindowUShort(hwnd, QWS_CXRESTORE);
        !           525:             us4 = (USHORT)WinQueryWindowUShort(hwnd, QWS_CYRESTORE);
        !           526:             sprintf(szTemp, "Restore: (%d, %d, %d, %d)",us1, us2, us3, us4);
        !           527:             WinSetDlgItemText(hwndDlg, DID_WOLINE3, (PSZ)szTemp);
        !           528: 
        !           529:             us1 = (USHORT)WinQueryWindowUShort(hwnd, QWS_XMINIMIZE);
        !           530:             us2 = (USHORT)WinQueryWindowUShort(hwnd, QWS_YMINIMIZE);
        !           531:             sprintf(szTemp, "Minimize: (%d, %d)",us1, us2);
        !           532:             WinSetDlgItemText(hwndDlg, DID_WOLINE4, (PSZ)szTemp);
        !           533:         } else {
        !           534:             /*
        !           535:              * Nothing special to output for this window type, so lets
        !           536:              * dump the window extra words.
        !           537:              * Note: This code is sh.ty
        !           538:              */
        !           539:             us1 = 0;    /* Word offset */
        !           540:             for (id=DID_WOLINE1; id <= DID_WOLINE4; id++) {
        !           541:                 szTemp[0] = '\0';
        !           542:                 for (us2 = 0; us2 < 4; us2++) {
        !           543:                     if (us1 >= classinfo.cbWindowData)
        !           544:                         break;
        !           545:                     us3 = (USHORT)WinQueryWindowUShort(hwnd, us1);
        !           546:                     sprintf(szTemp2, "%04x ", us3);
        !           547:                     strcat(szTemp, szTemp2);
        !           548:                     us1 += 2;   /* Setup for next word */
        !           549:                 }
        !           550: 
        !           551:                 /* output this line */
        !           552:                 WinSetDlgItemText(hwndDlg, id, (PSZ)szTemp);
        !           553:             }
        !           554:         }
        !           555:     }
        !           556: }
        !           557: 
        !           558: 
        !           559: 
        !           560: 
        !           561: /***************************************************************************\
        !           562: * DumpOneWindowInfo()
        !           563: *
        !           564: * Dump the information about one window to the current outputs
        !           565: \***************************************************************************/
        !           566: void    DumpOneWindowInfo()
        !           567: {
        !           568:     HWND        hwndPoint;
        !           569:     HWND        hwndT;
        !           570:     SHORT       wLevel;
        !           571: 
        !           572:     hwndPoint = HwndSelWinWithMouse(hwndSpy, NULL);
        !           573:     if (hwndPoint == NULL)
        !           574:         return;    /* No window selected */
        !           575: 
        !           576:     /* Now see what level the window is at */
        !           577:     wLevel = 0;
        !           578:     hwndT = hwndPoint;
        !           579:     while (hwndT != NULL) {
        !           580:         wLevel++;
        !           581:         hwndT = WinQueryWindow(hwndT, QW_PARENT, FALSE);
        !           582:     };
        !           583: 
        !           584: 
        !           585:     DumpWindowInfo(hwndPoint, wLevel);
        !           586: }
        !           587: 
        !           588: 
        !           589: /****************************************************************************\
        !           590: * DumpAllWIndowsInfo (HWND hwnd, WORD wLevel)
        !           591: *
        !           592: * Dumps the complet window list out to the current output units.
        !           593: \***************************************************************************/
        !           594: SHORT DumpAllWindowsInfo(hwnd, wLevel)
        !           595: HWND    hwnd;
        !           596: SHORT   wLevel;
        !           597: {
        !           598:     HWND    hwndT;
        !           599:     SPWD    *pspwdT;
        !           600:     SHORT   cWindowBytes;
        !           601: 
        !           602:     pspwdT = pspwd + wDumpCount;
        !           603: 
        !           604:     cWindowBytes = DumpWindowInfo(hwnd, wLevel);
        !           605: 
        !           606:     pspwdT->hwnd = hwnd;
        !           607:     pspwdT->index = wDumpCount;
        !           608: 
        !           609: 
        !           610:     /*
        !           611:      * Then we recurse with all of our children
        !           612:      */
        !           613:     if ((hwndT = WinQueryWindow(hwnd, QW_TOP, FALSE)) != NULL)
        !           614:         cWindowBytes += DumpAllWindowsInfo(hwndT, wLevel+1);
        !           615: 
        !           616:     /*
        !           617:      * Then go to our next sibling
        !           618:      */
        !           619:     if ((hwndT = WinQueryWindow(hwnd, QW_NEXT, FALSE)) != NULL)
        !           620:         cWindowBytes += DumpAllWindowsInfo(hwndT, wLevel);
        !           621: 
        !           622:     return (cWindowBytes);
        !           623: }
        !           624: 
        !           625: 
        !           626: 
        !           627: /****************************************************************************\
        !           628: * DumpWindowIndex (void)
        !           629: *
        !           630: * Dump a sorted list of Hwnds and index into other list
        !           631: \***************************************************************************/
        !           632: void    DumpWindowIndex(cBytes)
        !           633: SHORT   cBytes;
        !           634: {
        !           635:     SHORT   cch;
        !           636:     char    szTemp[20];
        !           637:     char    szOutput[100];
        !           638:     SPWD    *pspwdT;
        !           639:     SHORT   i;
        !           640: 
        !           641:     /* Sort the hwnds first */
        !           642:     qsort((void *)pspwd, wDumpCount, sizeof(SPWD), CompareHwnds);
        !           643:     pspwdT = pspwd;
        !           644: 
        !           645:     strcpy (szOutput, "Index of Window Handles");
        !           646:     cch = strlen(szOutput);
        !           647:     for (i=0; i< wDumpCount; i++) {
        !           648:         if ((i & 3) == 0) {
        !           649:             /* 4 per row */
        !           650:             OutputString(szOutput, cch);
        !           651:             szOutput[0] = '\0';
        !           652:             cch = 0;
        !           653:         }
        !           654: 
        !           655:         cch += sprintf(szTemp, "%3d-%04x ",
        !           656:                 pspwdT->index,    (USHORT)pspwdT->hwnd);
        !           657:         strcat (szOutput, szTemp);
        !           658:         pspwdT++;
        !           659:     }
        !           660: 
        !           661:     OutputString(szOutput, cch);
        !           662: 
        !           663:     cch = sprintf(szOutput, "Number of Windows: %d, Approx heap size: %d",
        !           664:             wDumpCount, cBytes);
        !           665:     OutputString(szOutput, cch);
        !           666: 
        !           667: 
        !           668: }
        !           669: 
        !           670: 
        !           671: /****************************************************************************\
        !           672: * int  CompareHwnds(SPWD *pspwd1, SPWD *pspwd2)
        !           673: *
        !           674: * Compares two window handles
        !           675: \***************************************************************************/
        !           676: int  cdecl CompareHwnds(pspwd1, pspwd2)
        !           677: const void    *pspwd1;
        !           678: const void    *pspwd2;
        !           679: {
        !           680:     return (((SPWD *)pspwd1)->hwnd < ((SPWD *)pspwd2)->hwnd)? -1 : 1;
        !           681: }
        !           682: 
        !           683: 
        !           684: 
        !           685: 
        !           686: /***************************************************************************\
        !           687: * DumpWindowInfo(HWND hwnd, SHORT wLevel)
        !           688: *
        !           689: * Displays the information about the selected window in the dialog
        !           690: \***************************************************************************/
        !           691: SHORT DumpWindowInfo(hwnd, wLevel)
        !           692: HWND        hwnd;
        !           693: SHORT       wLevel;
        !           694: {
        !           695:     HWND    hwndParent;
        !           696:     HWND    hwndChild;
        !           697:     HWND    hwndOwner;
        !           698: 
        !           699:     char    szTemp[100];
        !           700:     char    szTemp2[20];
        !           701:     SHORT   cch;
        !           702:     char    szClass[30];
        !           703:     RECTL   rcl;
        !           704:     USHORT  id;
        !           705:     ULONG   ulStyle;
        !           706:     ULONG   ulPFNWP;
        !           707:     ULONG   ulHMQ;
        !           708:     SHORT   wOffsetClassData;
        !           709:     SHORT   wWindowWord;
        !           710:     PID     pidWindow;
        !           711:     TID     tidWindow;
        !           712: 
        !           713:     CLASSINFO   classinfo;
        !           714: 
        !           715:     hwndParent = WinQueryWindow(hwnd, QW_PARENT, FALSE);
        !           716:     hwndChild = WinQueryWindow(hwnd, QW_TOP, FALSE);
        !           717:     hwndOwner = WinQueryWindow(hwnd, QW_OWNER, FALSE);
        !           718:     id = (USHORT)WinQueryWindowUShort(hwnd, QWS_ID);
        !           719:     ulHMQ = (ULONG)WinQueryWindowULong(hwnd, QWL_HMQ);
        !           720:     WinQueryWindowRect(hwnd, &rcl);
        !           721:     WinMapWindowPoints(hwnd, hwndParent, (PPOINTL)&rcl, 2);
        !           722: 
        !           723:     cch = sprintf(szTemp,
        !           724:         "%d-H:%04x(%d) P:%04x C:%04x O:%04x ID:%04x MQ:%04x (%d, %d) (%d, %d)",
        !           725:         ++wDumpCount, (SHORT)hwnd, wLevel, (SHORT)hwndParent,
        !           726:         (SHORT)hwndChild, (SHORT)hwndOwner, id, (SHORT)ulHMQ,
        !           727:         (SHORT)rcl.xLeft, (SHORT)rcl.yBottom,
        !           728:         (SHORT)rcl.xRight, (SHORT)rcl.yTop);
        !           729: 
        !           730:     OutputString(szTemp, cch);
        !           731: 
        !           732:     ulStyle = (ULONG)WinQueryWindowULong(hwnd, QWL_STYLE);
        !           733:     ulPFNWP = (ULONG)WinQueryWindowULong(hwnd, QWP_PFNWP);
        !           734:     WinQueryClassName(hwnd, sizeof(szClass), (PSZ)szClass);
        !           735:     if (!WinQueryClassInfo(hab, (PSZ)szClass, &classinfo)) {
        !           736:         classinfo.flClassStyle = -1;    /* Let know error conditon */
        !           737:         classinfo.cbWindowData = 0;     /* Make sure we dont dump */
        !           738:     }
        !           739: 
        !           740:     WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
        !           741: 
        !           742:     cch = sprintf(szTemp,
        !           743:         "          St:%08lx  PID:%d  TID:%d  Pfn:%p  Cl:%s",
        !           744:         ulStyle, pidWindow, tidWindow, ulPFNWP, szClass);
        !           745:     OutputString(szTemp, cch);
        !           746: 
        !           747:     /*
        !           748:      * Dump the window extra words out also.
        !           749:      */
        !           750:     strcpy (szTemp, "          ");
        !           751:     id = 8;
        !           752:     for (wOffsetClassData = 0; wOffsetClassData < classinfo.cbWindowData;
        !           753:             wOffsetClassData += 2) {
        !           754: 
        !           755:         wWindowWord = (USHORT)WinQueryWindowUShort(hwnd, wOffsetClassData);
        !           756:         sprintf(szTemp2, "%04x ", wWindowWord);
        !           757:         strcat(szTemp, szTemp2);
        !           758:         if (--id == 0) {
        !           759:             /* line full is full */
        !           760:             OutputString(szTemp, strlen(szTemp));
        !           761:             szTemp[10] = '\0';
        !           762:             id = 8;
        !           763:         }
        !           764:     }
        !           765: 
        !           766:     if (id != 8)
        !           767:         OutputString(szTemp, strlen(szTemp));
        !           768: 
        !           769:     /* Return the number of bytes associated with the window */
        !           770:     return ((SIZEOFWND + classinfo.cbWindowData + 3) & 0xfffc);
        !           771: }
        !           772: 
        !           773: 
        !           774: 
        !           775: 
        !           776: /***************************************************************************\
        !           777: * SelOrDeselWithMouse(BOOL fSelect)
        !           778: *
        !           779: * Fastway to add/or remove window from watch list
        !           780: \***************************************************************************/
        !           781: 
        !           782: void SelOrDeselWithMouse(fSelect)
        !           783: BOOL    fSelect;
        !           784: {
        !           785:     HWND    rghwnd[MAXHWNDS];
        !           786:     HWND    hwndPoint;
        !           787:     SHORT    chwnd;
        !           788:     BOOL    fWinCurInList;
        !           789:     SHORT    i;
        !           790: 
        !           791:     /* First get the window of interest */
        !           792:     hwndPoint = HwndSelWinWithMouse(hwndSpy, NULL);
        !           793:     if (hwndPoint == NULL)
        !           794:         return;    /* No window selected */
        !           795:     fWinCurInList = SpyFWindowInList(hwndPoint, TRUE);
        !           796: 
        !           797:     if ((fWinCurInList && fSelect)
        !           798:             || (!fWinCurInList && !fSelect))
        !           799:         return;        /* Alredy right state */
        !           800: 
        !           801:     chwnd = SpyGetWindowList(MAXHWNDS, (HWND FAR *)rghwnd);
        !           802: 
        !           803:     if (fSelect) {
        !           804:         /* Add window to end of list */
        !           805:         rghwnd[chwnd++] = hwndPoint;
        !           806:     } else {
        !           807:         /* find it in the list, and delete it out */
        !           808:         for (i=0; rghwnd[i] != hwndPoint; i++)
        !           809:             ;
        !           810: 
        !           811:         /* Now copy rest of them down */
        !           812:         chwnd--;    /* One less item */
        !           813:         for (;i < chwnd; i++ ) {
        !           814:             rghwnd[i] = rghwnd[i+1];
        !           815:         }
        !           816:     }
        !           817: 
        !           818:     /* Now call to update the list */
        !           819:     SpySetWindowList(chwnd, (HWND FAR *)rghwnd);
        !           820: }
        !           821: 
        !           822: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.