Annotation of os232sdk/toolkt20/c/samples/spy/window.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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