|
|
1.1 ! root 1: /***************************************************************************\ ! 2: * message.c - procecures to process the message dialog ! 3: * ! 4: * Created by Microsoft Corporation, 1989 ! 5: \***************************************************************************/ ! 6: ! 7: #define INCL_WINBUTTONS ! 8: #define INCL_WINDIALOGS ! 9: #define INCL_WINFRAMEMGR ! 10: #define INCL_WINHEAP /* needed for spy.h */ ! 11: #define INCL_WININPUT ! 12: #define INCL_WINLISTBOXES ! 13: #define INCL_WINMESSAGEMGR ! 14: #define INCL_WINMENUS ! 15: #define INCL_WINPOINTERS ! 16: #define INCL_WINWINDOWMGR ! 17: #include <os2.h> ! 18: #include <spyhook.h> ! 19: #include <stdio.h> ! 20: #include <stdlib.h> ! 21: #include <string.h> ! 22: #include <time.h> ! 23: #include "spy.h" ! 24: ! 25: #define SIZEOFWND 34 ! 26: #define MAXMSGBYTES 100 ! 27: ! 28: /* Procedure prototypes */ ! 29: void UpdMsgsLBSels (USHORT, BOOL); ! 30: void UpdMsgTblFromLB (HWND); ! 31: void ProcessQueueMsg(QMSGSPY *); ! 32: void SelOrDeselWithMouse(BOOL); ! 33: void UpdateMsgBoxCurMsgText(HWND); ! 34: void SelectMessageFromText(HWND); ! 35: MRESULT CALLBACK SpyMsgDlgProc(HWND, USHORT, MPARAM, MPARAM); ! 36: ! 37: /***************************************************************************\ ! 38: * MRESULT CALLBACK SpyMsgDlgProc (hwnd, msg, mp1, mp2) ! 39: * ! 40: * Message List dialog procedure ! 41: \***************************************************************************/ ! 42: MRESULT CALLBACK SpyMsgDlgProc(hwnd, msg, mp1, mp2) ! 43: HWND hwnd; ! 44: USHORT msg; ! 45: MPARAM mp1; ! 46: MPARAM mp2; ! 47: { ! 48: SHORT i; ! 49: MSGI *pmsgi; ! 50: USHORT item; ! 51: SHORT bHooksNew; ! 52: USHORT iItemFocus; /* Index to item that has the focus */ ! 53: ! 54: switch (msg) { ! 55: ! 56: case WM_INITDLG: ! 57: /* ! 58: * Initialize the list box with the list of messages that are ! 59: * defined in our message table ! 60: */ ! 61: iCurItemFocus = -1; ! 62: pmsgi = rgmsgi; /* Point to start of list */ ! 63: hwndMessageLB = WinWindowFromID(hwnd, DID_OMSGLIST); ! 64: for (i = 0; i < cmsgi; i++) { ! 65: pmsgi->iListBox = item = (USHORT)WinSendMsg(hwndMessageLB, ! 66: LM_INSERTITEM, ! 67: (MPARAM)(spyopt.fAlphaSortMsgList? LIT_SORTASCENDING : LIT_END), ! 68: (MPARAM)(PSZ)pmsgi->szMsg); ! 69: WinSendMsg(hwndMessageLB, LM_SETITEMHANDLE, (MPARAM)item, ! 70: (MPARAM)i); ! 71: if (pmsgi->wOptions & MSGI_ENABLED) { ! 72: WinSendMsg(hwndMessageLB, LM_SELECTITEM, (MPARAM)item, ! 73: (MPARAM)TRUE); ! 74: } ! 75: pmsgi++; ! 76: } ! 77: ! 78: /* Initialize the Hook type record */ ! 79: WinSendDlgItemMsg(hwnd, DID_OINPUT, BM_SETCHECK, ! 80: (MPARAM)(spyopt.bHooks & SPYH_INPUT)?1 : 0, 0L); ! 81: ! 82: WinSendDlgItemMsg(hwnd, DID_OSENDMSG, BM_SETCHECK, ! 83: (MPARAM)(spyopt.bHooks & SPYH_SENDMSG)?1 : 0, 0L); ! 84: ! 85: WinSendDlgItemMsg(hwnd, DID_OTHERMSGS, BM_SETCHECK, ! 86: (MPARAM)(spyopt.fDispOtherMsgs), 0L); ! 87: ! 88: WinSetFocus(HWND_DESKTOP, hwndMessageLB); ! 89: fTrackingListBox = TRUE; ! 90: return (TRUE); /* We set the focus */ ! 91: ! 92: break; ! 93: ! 94: case WM_CHAR: ! 95: /* ! 96: * Handle VK_ENTER and VK_NEWLINE if our Edit control has ! 97: * the focus and it is a keydown ! 98: */ ! 99: if (!(SHORT1FROMMP(mp1) & KC_KEYUP) && ! 100: (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) && ! 101: ( (SHORT2FROMMP(mp2) == VK_ENTER) || ! 102: (SHORT2FROMMP(mp2) == VK_NEWLINE) )) { ! 103: ! 104: ! 105: if (WinQueryFocus(HWND_DESKTOP, FALSE) == ! 106: WinWindowFromID(hwnd, DID_MSGEDIT)) { ! 107: SelectMessageFromText(hwnd); ! 108: break; ! 109: } ! 110: } ! 111: ! 112: /* Normaly pass to dialog procedure to handle message */ ! 113: return(WinDefDlgProc(hwnd, msg, mp1, mp2)); ! 114: break; ! 115: ! 116: case WM_COMMAND: ! 117: switch (SHORT1FROMMP(mp1)) { ! 118: case DID_OK: ! 119: ! 120: /* ! 121: * Call to update the Message table select bits ! 122: */ ! 123: ! 124: UpdMsgTblFromLB (hwnd); ! 125: ! 126: /* Setup new hook options */ ! 127: bHooksNew = 0; ! 128: ! 129: if ((BOOL)WinSendDlgItemMsg(hwnd, ! 130: DID_OINPUT, BM_QUERYCHECK, 0L, 0L)) ! 131: bHooksNew = SPYH_INPUT; ! 132: ! 133: if ((BOOL)WinSendDlgItemMsg(hwnd, ! 134: DID_OSENDMSG, BM_QUERYCHECK, 0L, 0L)) ! 135: bHooksNew |= SPYH_SENDMSG; ! 136: ! 137: if (bHooksNew != spyopt.bHooks) { ! 138: SpyReleaseHook (FALSE); /* Dont clear queue */ ! 139: spyopt.bHooks = bHooksNew; ! 140: SpyInstallHook(hab, hmqSpy, spyopt.bHooks); /* Install hook again */ ! 141: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU), ! 142: MM_SETITEMATTR, MPFROM2SHORT(CMD_INPUTHOOK, TRUE), ! 143: MPFROM2SHORT(MIA_CHECKED, ! 144: (spyopt.bHooks & SPYH_INPUT) ? MIA_CHECKED : 0)); ! 145: WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU), ! 146: MM_SETITEMATTR, MPFROM2SHORT(CMD_SENDMSGHOOK, TRUE), ! 147: MPFROM2SHORT(MIA_CHECKED, ! 148: (spyopt.bHooks & SPYH_SENDMSG) ? MIA_CHECKED : 0)); ! 149: } ! 150: ! 151: /* Fall through to DID_CANCEL */ ! 152: case DID_CANCEL: ! 153: /* Now dismiss the dialog */ ! 154: hwndMessageLB = NULL; /* Not here anymore to process */ ! 155: fTrackingListBox = FALSE; ! 156: WinDismissDlg(hwnd, SHORT1FROMMP(mp1)); ! 157: break; ! 158: ! 159: /* ! 160: * These case simply update the listbox with which messages are ! 161: * enabled ! 162: */ ! 163: case DID_MALL: ! 164: UpdMsgsLBSels (0, TRUE); ! 165: break; ! 166: case DID_MNONE: ! 167: UpdMsgsLBSels (0, FALSE); ! 168: break; ! 169: case DID_MCON: ! 170: UpdMsgsLBSels (MSGI_KEY, TRUE); ! 171: break; ! 172: case DID_MCOFF: ! 173: UpdMsgsLBSels (MSGI_KEY, FALSE); ! 174: break; ! 175: case DID_MMON: ! 176: UpdMsgsLBSels (MSGI_MOUSE, TRUE); ! 177: break; ! 178: case DID_MMOFF: ! 179: UpdMsgsLBSels (MSGI_MOUSE, FALSE); ! 180: break; ! 181: case DID_MFON: ! 182: UpdMsgsLBSels (MSGI_FREQ, TRUE); ! 183: break; ! 184: case DID_MFOFF: ! 185: UpdMsgsLBSels (MSGI_FREQ, FALSE); ! 186: break; ! 187: } ! 188: break; ! 189: ! 190: default: ! 191: /* ! 192: * Default is to see if the listbox has changed its focus ! 193: * item number. If it has, then we want to display the information ! 194: * about the window that the listbox cursor is over. There is no ! 195: * legal way to do this, except to temporarily put the listbox into ! 196: * single selection mode and query the selection. ! 197: */ ! 198: if (fTrackingListBox && (hwndMessageLB != NULL)) { ! 199: WinSetWindowBits(hwndMessageLB, QWL_STYLE, 0L, LS_MULTIPLESEL); ! 200: iItemFocus = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION, ! 201: (MPARAM)LIT_FIRST, 0L); ! 202: WinSetWindowBits(hwndMessageLB, QWL_STYLE, LS_MULTIPLESEL, ! 203: LS_MULTIPLESEL); ! 204: if (iItemFocus != iCurItemFocus) { ! 205: iCurItemFocus = iItemFocus; ! 206: UpdateMsgBoxCurMsgText(hwnd); ! 207: } ! 208: } ! 209: return(WinDefDlgProc(hwnd, msg, mp1, mp2)); ! 210: break; ! 211: } ! 212: return 0L; ! 213: } ! 214: ! 215: ! 216: ! 217: /***************************************************************************\ ! 218: * void UpdateMsgBoxCurMsgText() ! 219: * ! 220: * Updates the text that is displayed in the message text line ! 221: \***************************************************************************/ ! 222: void UpdateMsgBoxCurMsgText(hwndDlg) ! 223: HWND hwndDlg; ! 224: { ! 225: SHORT sMsgI; ! 226: char szTemp[80]; ! 227: ! 228: ! 229: if (iCurItemFocus >= 0) { ! 230: /* Get the messge index */ ! 231: sMsgI = (SHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE, ! 232: (MPARAM)iCurItemFocus, 0L); ! 233: sprintf(szTemp, "0x%04x - %s", rgmsgi[sMsgI].msg, ! 234: rgmsgi[sMsgI].szMsg); ! 235: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)szTemp); ! 236: } else { ! 237: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)""); ! 238: } ! 239: ! 240: } ! 241: ! 242: ! 243: ! 244: ! 245: /***************************************************************************\ ! 246: * void SelectMessageFromText(hwndDlg) ! 247: * ! 248: * Updates the text that is displayed in the message text line ! 249: \***************************************************************************/ ! 250: void SelectMessageFromText(hwndDlg) ! 251: HWND hwndDlg; ! 252: { ! 253: char szTemp[80]; ! 254: USHORT msg; ! 255: MSGI *pmsgi; ! 256: int i; ! 257: ! 258: ! 259: /* First get the edit text from the string */ ! 260: WinQueryDlgItemText(hwndDlg, DID_MSGEDIT, sizeof(szTemp), ! 261: (PSZ)szTemp); ! 262: ! 263: if ((msg = UConvertStringToNum(szTemp)) != 0xffff) { ! 264: ! 265: /* We have a number, now try to find message in message table */ ! 266: pmsgi = PmsgiFromMsg(msg); ! 267: ! 268: } else { ! 269: /* Assume String, Try to locate string in our table */ ! 270: pmsgi = rgmsgi; /* Start at beginning of table */ ! 271: /* ! 272: * This does simple string compares, it does not map case, nor ! 273: * does it trim the string. ! 274: */ ! 275: for (i=0; i < cmsgi; i++) { ! 276: if (strcmpi(pmsgi->szMsg, szTemp) == 0) ! 277: break; ! 278: pmsgi++; ! 279: }; ! 280: ! 281: if (i >= cmsgi) ! 282: pmsgi = NULL; ! 283: } ! 284: ! 285: /* ! 286: * Have a pointer to MSGI of message, or NULL if not in list. ! 287: */ ! 288: if(pmsgi != NULL) { ! 289: /* First make sure it is visible */ ! 290: WinSendMsg(hwndMessageLB, LM_SETTOPINDEX, ! 291: MPFROMSHORT(pmsgi->iListBox), (MPARAM)0L); ! 292: ! 293: /* Always set it on */ ! 294: WinSendMsg(hwndMessageLB, LM_SELECTITEM, ! 295: MPFROMSHORT(pmsgi->iListBox), MPFROMSHORT(TRUE)); ! 296: ! 297: } else { ! 298: WinAlarm(HWND_DESKTOP, WA_WARNING); ! 299: WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)""); ! 300: } ! 301: } ! 302: ! 303: ! 304: ! 305: ! 306: ! 307: /***************************************************************************\ ! 308: * void UpdMsgsLBSels (USHORT uMask, fOnOrOff); ! 309: * ! 310: * Will update the selected items in the message listbox, that is ! 311: * displayed in the options dialog ! 312: \***************************************************************************/ ! 313: void UpdMsgsLBSels (uMask, fOnOrOff) ! 314: USHORT uMask; ! 315: BOOL fOnOrOff; ! 316: { ! 317: ! 318: SHORT i; ! 319: MSGI *pmsgi; ! 320: ! 321: /* ! 322: * Loop through all of the items in our list, if the mask is 0 or ! 323: * the bit is on in the item, then update the select state in listbox ! 324: * defined in our message table ! 325: */ ! 326: fTrackingListBox = FALSE; ! 327: pmsgi = rgmsgi; /* Point to start of list */ ! 328: for (i = 0; i < cmsgi; i++) { ! 329: if ((uMask == 0) || (pmsgi->wOptions & uMask)) { ! 330: WinSendMsg(hwndMessageLB, LM_SELECTITEM, ! 331: (MPARAM)pmsgi->iListBox, (MPARAM)fOnOrOff); ! 332: } ! 333: pmsgi++; ! 334: } ! 335: fTrackingListBox = TRUE; ! 336: } ! 337: ! 338: ! 339: ! 340: /***************************************************************************\ ! 341: * void UpdMsgTblFromLB (HWND hwndDialog); ! 342: * ! 343: * Will update the selected items in the message listbox, that is ! 344: * displayed in the options dialog ! 345: \***************************************************************************/ ! 346: void UpdMsgTblFromLB (hwndDialog) ! 347: HWND hwndDialog; ! 348: { ! 349: ! 350: USHORT i; ! 351: register MSGI *pmsgi; ! 352: USHORT itemSel; ! 353: ! 354: /* ! 355: * Loop through all of the items in the list and update the selection ! 356: * status depending of if the item is selected in the list box or ! 357: * not. ! 358: */ ! 359: /* First simply turn off all of the bits */ ! 360: pmsgi = rgmsgi; ! 361: for (i = 0; i < cmsgi; i++) { ! 362: pmsgi->wOptions &= ~MSGI_ENABLED; ! 363: pmsgi++; ! 364: } ! 365: ! 366: /* Then turn on all of the selected items */ ! 367: itemSel = (USHORT)LIT_FIRST; ! 368: ! 369: while ((itemSel = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION, ! 370: (MPARAM)itemSel, 0L)) != (USHORT)LIT_NONE) { ! 371: ! 372: /* The item handle contains index in our array */ ! 373: i = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE, ! 374: (MPARAM)itemSel, 0L); ! 375: ! 376: rgmsgi[i].wOptions |= MSGI_ENABLED; ! 377: } ! 378: ! 379: /* Get the Other message option from checkmark */ ! 380: spyopt.fDispOtherMsgs = ((BOOL)WinSendDlgItemMsg(hwndDialog, DID_OTHERMSGS, ! 381: BM_QUERYCHECK, 0L, 0L)); ! 382: ! 383: /* Now call function to update the hooks message list */ ! 384: UpdateHooksMsgTable(); ! 385: } ! 386: ! 387: ! 388: ! 389: ! 390: /***************************************************************************\ ! 391: * void UpdateHooksMsgTable(void) ! 392: * ! 393: * Send the message bitmask to the hook, for interesting messages. ! 394: \***************************************************************************/ ! 395: void UpdateHooksMsgTable() ! 396: { ! 397: MSGI *pmsgi; ! 398: UCHAR rgb[MAXMSGFILTERBYTES]; ! 399: int i; ! 400: UCHAR *prgb; ! 401: unsigned char mask; ! 402: ! 403: /* ! 404: * First zero the bitmask ! 405: */ ! 406: memset(rgb,'\0', MAXMSGFILTERBYTES); ! 407: mask = 1; ! 408: prgb = rgb; ! 409: ! 410: /* ! 411: * Loop to set the bits ! 412: */ ! 413: pmsgi = rgmsgi; ! 414: for (i = 0; i <= MAXMSGFILTER; i++) { ! 415: /* If enabled, set bit in bit table */ ! 416: ! 417: if (pmsgi->msg == i) { ! 418: if (pmsgi->wOptions & MSGI_ENABLED) ! 419: *prgb = pmsgi->bMPTypes | MP_ENABLED; ! 420: ! 421: pmsgi++; ! 422: } else { ! 423: /* Hole in range, set it true */ ! 424: *prgb |= mask; ! 425: } ! 426: ! 427: prgb++; ! 428: } ! 429: ! 430: /* Now call the hook function with the new mask */ ! 431: SpySetMessageList((char far *)rgb, spyopt.fDispOtherMsgs); ! 432: } ! 433: ! 434: ! 435: ! 436: ! 437: /***************************************************************************\ ! 438: * EnableOrDisableMsg(BOOL fEnable) ! 439: * ! 440: * Fast way to enable or disable a particular message code. The one ! 441: * that is currently selected in the output listbox. ! 442: \***************************************************************************/ ! 443: ! 444: void EnableOrDisableMsg(fEnable) ! 445: BOOL fEnable; ! 446: { ! 447: USHORT itemSel; ! 448: char szTemp[100]; ! 449: char *psz; ! 450: MSGI *pmsgi; ! 451: SHORT i; ! 452: ! 453: itemSel = (USHORT)WinSendMsg(hwndSpyList, LM_QUERYSELECTION, ! 454: (MPARAM)LIT_FIRST, 0L); ! 455: if (itemSel == (USHORT)LIT_NONE) ! 456: return; /* None to process */ ! 457: ! 458: /* Get the message text */ ! 459: WinSendMsg(hwndSpyList, LM_QUERYITEMTEXT, ! 460: MPFROM2SHORT(itemSel, sizeof(szTemp)), (MPARAM)(PSZ)szTemp); ! 461: ! 462: /* Now lets extract the messgae string from the line */ ! 463: psz = &szTemp[3]; ! 464: while (*psz != ' ') ! 465: psz++; /* locate first blank */ ! 466: *psz = '\0'; /* Zero terminate string */ ! 467: ! 468: ! 469: /* ! 470: * Loop through all of the items in our list, until we find a ! 471: * string that matches our string. ! 472: */ ! 473: pmsgi = rgmsgi; /* Point to start of list */ ! 474: for (i = 0; i < cmsgi; i++) { ! 475: if (strcmpi(&szTemp[2], pmsgi->szMsg) == 0) { ! 476: /* ! 477: * Found our message, update the bit of the message, and ! 478: * call the function to let the hook know the new results ! 479: */ ! 480: if (fEnable) ! 481: pmsgi->wOptions |= MSGI_ENABLED; ! 482: else ! 483: pmsgi->wOptions &= ~MSGI_ENABLED; ! 484: ! 485: UpdateHooksMsgTable(); /* Set Spy's Msg table */ ! 486: return; ! 487: } ! 488: pmsgi++; ! 489: } ! 490: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.