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

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: }

unix.superglobalmegacorp.com

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