Annotation of pmsdk/samples/spy/queues.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************\
                      2: * queues.c - Spy code to manager the queue list dialog
                      3: *
                      4: * Created by Microsoft Corporation, 1989
                      5: \***************************************************************************/
                      6: 
                      7: #define        INCL_WINDIALOGS
                      8: #define        INCL_WINHEAP
                      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 <spyhook.h>
                     16: #include <stdio.h>
                     17: #include <stdlib.h>
                     18: #include <string.h>
                     19: #include <time.h>
                     20: #include "spy.h"
                     21: 
                     22: #define SIZEOFWND   34
                     23: #define MAXMSGBYTES 100
                     24: 
                     25: /* File Global Variables */
                     26: HMQ      hmqDlgDisp;
                     27: SHORT   chmqWatched = 0;
                     28: SHORT   chmqInList = 0;
                     29: 
                     30: 
                     31: 
                     32: /* Function Prototypes */
                     33: MRESULT CALLBACK SpyQueuesDlgProc(HWND, USHORT, MPARAM, MPARAM);
                     34: 
                     35: void    InitQueueList(VOID);
                     36: void    DisplayQueueInfoForWindow(HWND, HWND);
                     37: void    DisplayQueueInfo(HWND, HMQ);
                     38: void    SelectQueueFromText(HWND hwndDlg);
                     39: void    BuildQueueWatchList(void);
                     40: 
                     41: 
                     42: 
                     43: /***************************************************************************\
                     44: * MRESULT CALLBACK SpyQueuesDlgProc(hwnd, msg, mp1, mp2)
                     45: *
                     46: * The Spy Windows Dialog procedure
                     47: \***************************************************************************/
                     48: MRESULT CALLBACK SpyQueuesDlgProc(hwnd, msg, mp1, mp2)
                     49: HWND hwnd;
                     50: USHORT msg;
                     51: MPARAM mp1;
                     52: MPARAM mp2;
                     53: {
                     54:     BOOL        fSelect = TRUE;
                     55:     SHORT       cQueues;
                     56:     HWND        hwndPoint;
                     57:     HMQ         hmqDisp;
                     58:     HMQ         hmqItem;   /* from handle of list item */
                     59:     USHORT      iItemFocus; /* Index to item that has the focus */
                     60: 
                     61:     switch (msg) {
                     62: 
                     63:     case WM_INITDLG:
                     64:         /* Initialize the dialog items */
                     65:         hwndWindowLB = WinWindowFromID(hwnd, DID_WINDOWLIST);
                     66:         InitQueueList();
                     67:         hmqDlgDisp = NULL;
                     68:         fTrackingListBox = TRUE;
                     69:         break;
                     70: 
                     71:     case WM_CHAR:
                     72:         /*
                     73:          * Handle VK_ENTER and VK_NEWLINE if our Edit control has
                     74:          * the focus and it is a keydown
                     75:          */
                     76:         if (!(SHORT1FROMMP(mp1) & KC_KEYUP) &&
                     77:                 (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
                     78:                 ( (SHORT2FROMMP(mp2) == VK_ENTER) ||
                     79:                   (SHORT2FROMMP(mp2) == VK_NEWLINE) )) {
                     80: 
                     81: 
                     82:             if (WinQueryFocus(HWND_DESKTOP, FALSE) ==
                     83:                     WinWindowFromID(hwnd, DID_WHANDLE)) {
                     84:                 SelectQueueFromText(hwnd);
                     85:                 break;
                     86:             }
                     87:         }
                     88: 
                     89:         /* Normaly pass to dialog procedure to handle message */
                     90:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                     91:         break;
                     92: 
                     93:     case WM_COMMAND:
                     94:         switch (SHORT1FROMMP(mp1)) {
                     95:         case DID_OK:
                     96:             BuildQueueWatchList();
                     97: 
                     98:         case DID_CANCEL:
                     99:             /* Now dismiss the dialog */
                    100:             WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
                    101:             break;
                    102:         case DID_WUNSELALL:
                    103:             fSelect = FALSE;
                    104:         case DID_WSELALL:
                    105:             cQueues = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    106:                 0L, 0L);
                    107: 
                    108:             fTrackingListBox = FALSE;
                    109:             while (cQueues) {
                    110:                 /* Loop through all windows, selecting or unselcting all */
                    111:                 WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)--cQueues,
                    112:                     (MPARAM)fSelect);
                    113:             }
                    114:             fTrackingListBox = TRUE;
                    115:             break;
                    116: 
                    117:         case DID_WSELMOUSE:
                    118:             /* Call function to track mouse, returns window handle */
                    119:             hwndPoint = HwndSelWinWithMouse(hwnd, DisplayQueueInfoForWindow);
                    120:             if (hwndPoint == NULL)
                    121:                 break;    /* No window to process */
                    122: 
                    123:             /*
                    124:              * Now find the window in the list, Make the item visible
                    125:              * and set the item as selected.
                    126:              */
                    127:             hmqDisp = (HMQ)WinQueryWindowULong(hwndPoint, QWL_HMQ);
                    128:             cQueues = (SHORT) WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    129:                     0L, 0L);
                    130: 
                    131:             while (cQueues) {
                    132:                 /*
                    133:                  * Loop through all windows until we wind the right
                    134:                  * one with the correct window handle
                    135:                  */
                    136:                 hmqItem = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    137:                         (MPARAM)--cQueues, 0L);
                    138: 
                    139:                 if (hmqItem == hmqDisp) {
                    140:                     /* found the right item, move it to top */
                    141:                     WinSendMsg(hwndWindowLB, LM_SETTOPINDEX, (MPARAM)cQueues, 0L);
                    142:                     WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)cQueues,
                    143:                             (MPARAM)TRUE);
                    144:                     break;
                    145:                 }
                    146:             }
                    147:             break;
                    148:         }
                    149:         break;
                    150: 
                    151: 
                    152:     default:
                    153:         /*
                    154:          * Default is to see if the listbox has changed its focus
                    155:          * item number.  If it has, then we want to display the information
                    156:          * about the window that the listbox cursor is over.  There is no
                    157:          * legal way to do this, One approach appears to temporary set the
                    158:          * listbox to be a single selection listbox, then query its selection
                    159:          * and set it back into multiple selection mode.
                    160:          */
                    161:         if (fTrackingListBox && hwndWindowLB != NULL) {
                    162: 
                    163:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, 0L, LS_MULTIPLESEL);
                    164:             iItemFocus = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
                    165:                     (MPARAM)LIT_FIRST, 0L);
                    166:             WinSetWindowBits(hwndWindowLB, QWL_STYLE, LS_MULTIPLESEL,
                    167:                     LS_MULTIPLESEL);
                    168: 
                    169:             if (iItemFocus != iCurItemFocus) {
                    170:                 iCurItemFocus = iItemFocus;
                    171:                 if (iItemFocus != (USHORT)-1) {
                    172: 
                    173:                     hmqDisp = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    174:                             (MPARAM)iItemFocus, 0L);
                    175:                     DisplayQueueInfo(hwnd, hmqDisp);
                    176:                 }
                    177:             }
                    178:         }
                    179:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    180:     }
                    181:     return 0L;
                    182: }
                    183: 
                    184: 
                    185: 
                    186: 
                    187: /****************************************************************************\
                    188: * InitQueueList ()
                    189: *
                    190: * Builds the list of Queues displayed in the queues dialog
                    191: \***************************************************************************/
                    192: void InitQueueList()
                    193: {
                    194:     HENUM       henum;
                    195:     char        szClassName[50];    /* Class name of window */
                    196:     HWND        hwnd;
                    197:     ULONG       ulHMQ;
                    198:     PID         pidWindow;
                    199:     TID         tidWindow;
                    200:     SHORT       item;
                    201:     HMQ         *ahmqWatched;
                    202:     HMQ         *phmqT;
                    203:     SHORT       chmqAlloc;
                    204:     SHORT       i;
                    205: 
                    206:     /*
                    207:      * We will enumerate through all of the OBJECT windows looking for
                    208:      * windows that have the  WC_QUEUE type.
                    209:      */
                    210:     if (chmqWatched > 0) {
                    211:         ahmqWatched = (HMQ *)WinAllocMem(hHeap, sizeof(HMQ) * chmqWatched);
                    212:         chmqAlloc = chmqWatched;
                    213:         if (ahmqWatched != NULL)
                    214:             chmqWatched = SpyGetQueueList(chmqWatched, ahmqWatched);
                    215:     } else
                    216:         ahmqWatched = NULL;
                    217: 
                    218:     henum = WinBeginEnumWindows(HWND_OBJECT);
                    219:     if (henum == NULL)
                    220:         return;
                    221: 
                    222:     chmqInList = 0;
                    223:     while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    224:         WinLockWindow(hwnd, FALSE);
                    225:         WinQueryClassName(hwnd, sizeof(szClassName),
                    226:             (PSZ)szClassName);
                    227: 
                    228:         if (strcmp(szClassName, "#32767") == 0) {
                    229:             /*
                    230:              * We found an HMQ, add it to our list, Do not add our own
                    231:              * HMQ to the list!.
                    232:              */
                    233:             ulHMQ = (ULONG)WinQueryWindowULong(hwnd, QWL_HMQ);
                    234:             if ((HMQ)ulHMQ != hmqSpy) {
                    235:                 WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
                    236: 
                    237:                 /* Reuse szClassName */
                    238:                 sprintf(szClassName, "0x%04x (PID:%d TID:%d)",
                    239:                         (USHORT)ulHMQ, (SHORT)pidWindow, (SHORT)tidWindow);
                    240: 
                    241:                 item = (USHORT)WinSendMsg(hwndWindowLB, LM_INSERTITEM,
                    242:                         (MPARAM)LIT_END, (MPARAM)(PSZ)szClassName);
                    243: 
                    244:                 /* Set the item handle to the handle of the window */
                    245:                 WinSendMsg(hwndWindowLB, LM_SETITEMHANDLE, (MPARAM)item,
                    246:                         (MPARAM)ulHMQ);
                    247:                 chmqInList++;
                    248: 
                    249:                 /*
                    250:                  * Now see if we should select the item
                    251:                  */
                    252:                 if (phmqT = ahmqWatched) {
                    253:                     for (i = 0; i < chmqWatched; i++) {
                    254:                         if ((HMQ)ulHMQ == *phmqT++) {
                    255:                             WinSendMsg(hwndWindowLB, LM_SELECTITEM, (MPARAM)item,
                    256:                                     (MPARAM)TRUE);
                    257:                             break;
                    258:                         }
                    259:                     }
                    260:                 }
                    261:             }
                    262:         }
                    263: 
                    264:     }
                    265: 
                    266:     WinEndEnumWindows(henum);
                    267: 
                    268:     if (ahmqWatched)
                    269:         WinFreeMem(hHeap, (char *)ahmqWatched, chmqAlloc * sizeof(HMQ));
                    270: }
                    271: 
                    272: 
                    273: 
                    274: /***************************************************************************\
                    275: * DisplayQueueInfoForWindow(HWND hwndDialog, HWND hwnd)
                    276: *
                    277: * Displays the information about the selected window in the dialog
                    278: \***************************************************************************/
                    279: void DisplayQueueInfoForWindow(hwndDlg, hwndDisp)
                    280: HWND            hwndDlg;
                    281: HWND            hwndDisp;
                    282: {
                    283: HMQ             hmqDisp;
                    284: 
                    285:     /* simply get the HMQ for the window and call display function */
                    286:     hmqDisp = (HMQ)WinQueryWindowULong(hwndDisp, QWL_HMQ);
                    287:     DisplayQueueInfo(hwndDlg, hmqDisp);
                    288: }
                    289: 
                    290: 
                    291: 
                    292: 
                    293: /***************************************************************************\
                    294: * DisplayQueueInfo(HWND hwndDialog, HWND hwnd)
                    295: *
                    296: * Displays the information about the selected window in the dialog
                    297: \***************************************************************************/
                    298: void DisplayQueueInfo(hwndDlg, hmqDisp)
                    299: HWND            hwndDlg;
                    300: HMQ             hmqDisp;
                    301: {
                    302:     HWND        hwnd;
                    303:     HMQ         hmqWindow;
                    304:     HENUM       henum;
                    305:     char        szTemp[50];
                    306:     PID         pidWindow;
                    307:     TID         tidWindow;
                    308: 
                    309: 
                    310:     if (hmqDisp != hmqDlgDisp)
                    311:     {
                    312:         hmqDlgDisp = hmqDisp;
                    313: 
                    314:         /*
                    315:          * See if we can find a top level window for this HMQ
                    316:          */
                    317:         henum = WinBeginEnumWindows(HWND_DESKTOP);
                    318:         if (henum == NULL)
                    319:             return;
                    320: 
                    321:         while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    322:             WinLockWindow(hwnd, FALSE);
                    323:             hmqWindow = (HMQ)WinQueryWindowULong(hwnd, QWL_HMQ);
                    324: 
                    325:             if (hmqWindow == hmqDisp)
                    326:                 break;
                    327:         }
                    328:         WinEndEnumWindows(henum);
                    329: 
                    330: 
                    331:         if (hwnd == NULL) {
                    332:             /*
                    333:              * No top level windows found look for object window.
                    334:              */
                    335:             henum = WinBeginEnumWindows(HWND_OBJECT);
                    336:             if (henum == NULL)
                    337:                 return;
                    338: 
                    339:             while ((hwnd = WinGetNextWindow(henum)) != NULL) {
                    340:                 WinLockWindow(hwnd, FALSE);
                    341:                 hmqWindow = (HMQ)WinQueryWindowULong(hwnd, QWL_HMQ);
                    342: 
                    343:                 if (hmqWindow == hmqDisp)
                    344:                     break;
                    345:             }
                    346:             WinEndEnumWindows(henum);
                    347:             if (hwnd == NULL)
                    348:                 return;
                    349:         }
                    350: 
                    351:         /* output information to window now */
                    352:         sprintf(szTemp, "0x%04x", (SHORT)hmqDisp);
                    353:         WinSetDlgItemText(hwndDlg, DID_WHMQ, (PSZ)szTemp);
                    354: 
                    355:         sprintf(szTemp, "0x%04x", (SHORT)hwnd);
                    356:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)szTemp);
                    357: 
                    358:         /*
                    359:          * Warning, we only query the text if the window is not an object
                    360:          * window.  If it is an object window, the message queue may not
                    361:          * be processing messages, which could hang us
                    362:          */
                    363:         if (WinIsChild(hwnd, HWND_OBJECT))
                    364:             szTemp[0] = '\0';   /* No text available */
                    365:         else
                    366:             WinQueryWindowText(hwnd, sizeof(szTemp), (PSZ)szTemp);
                    367:         WinSetDlgItemText(hwndDlg, DID_WTEXT, (PSZ)szTemp);
                    368: 
                    369:         WinQueryWindowProcess(hwnd, &pidWindow, &tidWindow);
                    370:         sprintf(szTemp, "%d", (SHORT)pidWindow);
                    371:         WinSetDlgItemText(hwndDlg, DID_WPID, (PSZ)szTemp);
                    372:         sprintf(szTemp, "%d", (SHORT)tidWindow);
                    373:         WinSetDlgItemText(hwndDlg, DID_WTID, (PSZ)szTemp);
                    374:     }
                    375: }
                    376: 
                    377: 
                    378: 
                    379: /***************************************************************************\
                    380: * void SelectQueueFromText(hwndDlg)
                    381: *
                    382: *   Updates the text that is displayed in the message text line
                    383: \***************************************************************************/
                    384: void SelectQueueFromText(hwndDlg)
                    385: HWND    hwndDlg;
                    386: {
                    387:     char    szTemp[80];
                    388:     HMQ     hmqSelect;
                    389:     SHORT   cItems;
                    390:     SHORT   i;
                    391: 
                    392: 
                    393:     /* First get the edit text from the string */
                    394:     WinQueryDlgItemText(hwndDlg, DID_WHANDLE, sizeof(szTemp),
                    395:             (PSZ)szTemp);
                    396: 
                    397:     hmqSelect = (HMQ)UConvertStringToNum(szTemp);
                    398: 
                    399:     cItems = (SHORT)WinSendMsg(hwndWindowLB, LM_QUERYITEMCOUNT,
                    400:             0L, 0L);
                    401: 
                    402:     for (i=0; i < cItems; i++) {
                    403:         if ((HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    404:                 (MPARAM)i, 0L) == hmqSelect)
                    405:             break;  /* found it */
                    406:     }
                    407: 
                    408:     if (i < cItems) {
                    409:         /*
                    410:          * found the hmq, bring to top, and select it
                    411:          */
                    412:         WinSendMsg(hwndWindowLB, LM_SETTOPINDEX,
                    413:                 MPFROMSHORT(i),  (MPARAM)0L);
                    414: 
                    415:         /* Always set it on */
                    416:         WinSendMsg(hwndWindowLB, LM_SELECTITEM,
                    417:                 MPFROMSHORT(i), MPFROMSHORT(TRUE));
                    418: 
                    419:     } else {
                    420:         WinAlarm(HWND_DESKTOP, WA_WARNING);
                    421:         WinSetDlgItemText(hwndDlg, DID_WHANDLE, (PSZ)"");
                    422:     }
                    423: 
                    424: }
                    425: 
                    426: 
                    427: 
                    428: 
                    429: /***************************************************************************\
                    430: * BuildQueueWatchList()
                    431: *
                    432: * Updates the list of windows to be watched from the listbox
                    433: \***************************************************************************/
                    434: void BuildQueueWatchList(void)
                    435: {
                    436: 
                    437:     USHORT  itemPrevious;
                    438:     USHORT  item;
                    439: 
                    440:     HMQ     *ahmqList;
                    441:     HMQ     *phmqT;
                    442: 
                    443: 
                    444:     ahmqList = (HMQ *)WinAllocMem(hHeap, sizeof(HMQ) * chmqInList);
                    445:     if ((phmqT = ahmqList) == NULL)
                    446:         return;     /* Error */
                    447: 
                    448: 
                    449:     /*
                    450:      * Simply loop through asking for the next selected item in the
                    451:      * list.  Make sure not to overrun our list.
                    452:      */
                    453:     itemPrevious = (USHORT)LIT_FIRST;
                    454:     chmqWatched = 0;
                    455: 
                    456:     while ((item = (USHORT)WinSendMsg(hwndWindowLB, LM_QUERYSELECTION,
                    457:             (MPARAM)itemPrevious, 0L)) != (USHORT)LIT_NONE) {
                    458:         /*
                    459:          * Get the items handle, which has the value of the window handle
                    460:          */
                    461:         *phmqT++ = (HMQ)WinSendMsg(hwndWindowLB, LM_QUERYITEMHANDLE,
                    462:                 (MPARAM)item, 0L);
                    463:         chmqWatched++;
                    464: 
                    465:         itemPrevious = item;    /* Where to cointinue the search */
                    466:     }
                    467: 
                    468:     SpySetQueueList (chmqWatched, ahmqList);
                    469: 
                    470:     WinFreeMem(hHeap, (char *)ahmqList, sizeof(HMQ) * chmqInList);
                    471: }
                    472: 

unix.superglobalmegacorp.com

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