|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.