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

1.1       root        1: 
                      2: /****************************** Module Header ******************************\
                      3: * Module Name:  message.c - procecures to process the message dialog
                      4: *
                      5: * Created: Microsoft, IBM Corporation 1990
                      6: *
                      7: \***************************************************************************/
                      8: 
                      9: #define INCL_WIN
                     10: #define INCL_WINSYS
                     11: #define INCL_DOSPROCESS
                     12: #include <os2.h>
                     13: #include <stdio.h>
                     14: #include <string.h>
                     15: #include "spy.h"
                     16: #include "spyhk32.h"
                     17: #include <time.h>
                     18: #include <stdlib.h>
                     19: 
                     20: /* This is a real hack, estimate size of WND Structure */
                     21: #define SIZEOFWND   34
                     22: #define MAXMSGBYTES 100
                     23: 
                     24: /************* GLOBAL VARIABLES         */
                     25: 
                     26: 
                     27: /************* PROCEDURE DECLARATIONS   */
                     28: 
                     29: 
                     30: 
                     31: void    UpdMsgsLBSels (USHORT, BOOL);
                     32: void    UpdMsgTblFromLB (HWND);
                     33: void    ProcessQueueMsg(QMSGSPY *);
                     34: void    SelOrDeselWithMouse(BOOL);
                     35: void    UpdateMsgBoxCurMsgText(HWND);
                     36: 
                     37: void    SelectMessageFromText(HWND);
                     38: void    SendMsgProcCmd(HWND, USHORT);
                     39: void    SetItemHexNum(HWND, USHORT, ULONG);
                     40: ULONG   GetItemVal(HWND, USHORT, BOOL, PSZ, PSZ);
                     41: 
                     42: 
                     43: 
                     44: 
                     45: 
                     46: /**************************** Public Function ******************************\
                     47: * MRESULT EXPENTRY SpyMsgDlgProc (hwnd, msg, mp1, mp2)
                     48: *
                     49: * Effects: Message List dialog procedure
                     50: *
                     51: *
                     52: * Return value:
                     53: \***************************************************************************/
                     54: MRESULT EXPENTRY SpyMsgDlgProc(hwnd, msg, mp1, mp2)
                     55: HWND            hwnd;
                     56: USHORT          msg;
                     57: MPARAM          mp1;
                     58: MPARAM          mp2;
                     59: {
                     60:     SHORT       i;
                     61:     MSGI        *pmsgi;
                     62:     USHORT      item;
                     63:     SHORT       bHooksNew;
                     64:     USHORT      iItemFocus; /* Index to item that has the focus */
                     65: 
                     66:     switch (msg) {
                     67: 
                     68:     case WM_INITDLG:
                     69:         /*
                     70:          * Initialize the list box with the list of messages that are
                     71:          * defined in our message table
                     72:          */
                     73:         iCurItemFocus = -1;
                     74:         pmsgi = rgmsgi; /* Point to start of list */
                     75:         hwndMessageLB = WinWindowFromID(hwnd, DID_OMSGLIST);
                     76:         for (i = 0; i < cmsgi; i++) {
                     77:             pmsgi->iListBox = item = (USHORT)WinSendMsg(hwndMessageLB,
                     78:                     LM_INSERTITEM,
                     79:                     (MPARAM)(spyopt.fAlphaSortMsgList? LIT_SORTASCENDING : LIT_END),
                     80:                     (MPARAM)(PSZ)pmsgi->szMsg);
                     81:             WinSendMsg(hwndMessageLB, LM_SETITEMHANDLE, (MPARAM)item,
                     82:                 (MPARAM)i);
                     83:             if (pmsgi->wOptions & MSGI_ENABLED) {
                     84:                 WinSendMsg(hwndMessageLB, LM_SELECTITEM, (MPARAM)item,
                     85:                 (MPARAM)TRUE);
                     86:             }
                     87:             pmsgi++;
                     88:         }
                     89: 
                     90:         /*
                     91:          * If alpha Sort, we need to make a second pass through, and update
                     92:          * our indexes of where each message is in the list box
                     93:          */
                     94:         if (spyopt.fAlphaSortMsgList) {
                     95:             for (i = 0; i < cmsgi; i++) {
                     96:                 item = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
                     97:                         MPFROMSHORT(i), 0L);
                     98:                 rgmsgi[item].iListBox = i;
                     99:             }
                    100:         }
                    101: 
                    102: 
                    103: 
                    104:         /* Initialize the Hook type record */
                    105:         WinSendDlgItemMsg(hwnd, DID_OINPUT, BM_SETCHECK,
                    106:                 (MPARAM)(spyopt.bHooks & SPYH_INPUT)?1 : 0, 0L);
                    107: 
                    108:         WinSendDlgItemMsg(hwnd, DID_OSENDMSG, BM_SETCHECK,
                    109:                 (MPARAM)(spyopt.bHooks & SPYH_SENDMSG)?1 : 0, 0L);
                    110: 
                    111:         WinSendDlgItemMsg(hwnd, DID_OTHERMSGS, BM_SETCHECK,
                    112:                 (MPARAM)(spyopt.fDispOtherMsgs), 0L);
                    113: 
                    114:         WinSetFocus(HWND_DESKTOP, hwndMessageLB);
                    115:         fTrackingListBox = TRUE;
                    116:         return ((MRESULT)TRUE);  /* We set the focus */
                    117: 
                    118:         break;
                    119: 
                    120:     case WM_CHAR:
                    121:         /*
                    122:          * Handle VK_ENTER and VK_NEWLINE if our Edit control has
                    123:          * the focus and it is a keydown
                    124:          */
                    125:         if (!(SHORT1FROMMP(mp1) & KC_KEYUP) &&
                    126:                 (SHORT1FROMMP(mp1) & KC_VIRTUALKEY) &&
                    127:                 ( (SHORT2FROMMP(mp2) == VK_ENTER) ||
                    128:                   (SHORT2FROMMP(mp2) == VK_NEWLINE) )) {
                    129: 
                    130: 
                    131:             if (WinQueryFocus(HWND_DESKTOP, FALSE) ==
                    132:                     WinWindowFromID(hwnd, DID_MSGEDIT)) {
                    133:                 SelectMessageFromText(hwnd);
                    134:                 break;
                    135:             }
                    136:         }
                    137: 
                    138:         /* Normaly pass to dialog procedure to handle message */
                    139:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    140:         break;
                    141: 
                    142:     case WM_COMMAND:
                    143:         switch (SHORT1FROMMP(mp1)) {
                    144:         case DID_OK:
                    145: 
                    146:             /*
                    147:              * Call to update the Message table select bits
                    148:              */
                    149: 
                    150:             UpdMsgTblFromLB (hwnd);
                    151: 
                    152:             /* Setup new hook options */
                    153:             bHooksNew = 0;
                    154: 
                    155:             if ((BOOL)WinSendDlgItemMsg(hwnd,
                    156:                     DID_OINPUT, BM_QUERYCHECK, 0L, 0L))
                    157:                 bHooksNew = SPYH_INPUT;
                    158: 
                    159:             if ((BOOL)WinSendDlgItemMsg(hwnd,
                    160:                     DID_OSENDMSG, BM_QUERYCHECK, 0L, 0L))
                    161:                 bHooksNew |= SPYH_SENDMSG;
                    162: 
                    163:             if (bHooksNew != spyopt.bHooks) {
                    164:                 SpyReleaseHook (FALSE);     /* Dont clear queue */
                    165:                 spyopt.bHooks = bHooksNew;
                    166:                 SpyInstallHook(hab, hmqSpy, spyopt.bHooks); /* Install hook again */
                    167:                 WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
                    168:                     MM_SETITEMATTR, MPFROM2SHORT(CMD_INPUTHOOK, TRUE),
                    169:                     MPFROM2SHORT(MIA_CHECKED,
                    170:                          (spyopt.bHooks & SPYH_INPUT) ? MIA_CHECKED : 0));
                    171:                 WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
                    172:                     MM_SETITEMATTR, MPFROM2SHORT(CMD_SENDMSGHOOK, TRUE),
                    173:                     MPFROM2SHORT(MIA_CHECKED,
                    174:                          (spyopt.bHooks & SPYH_SENDMSG) ? MIA_CHECKED : 0));
                    175:             }
                    176: 
                    177:             /* Fall through to DID_CANCEL */
                    178:         case DID_CANCEL:
                    179:             /* Now dismiss the dialog */
                    180:             hwndMessageLB = NULL;   /* Not here anymore to process */
                    181:             fTrackingListBox = FALSE;
                    182:             WinDismissDlg(hwnd, SHORT1FROMMP(mp1));
                    183:             break;
                    184: 
                    185:         /*
                    186:          * These case simply update the listbox with which messages are
                    187:          * enabled
                    188:          */
                    189:         case DID_MALL:
                    190:             UpdMsgsLBSels (0, TRUE);
                    191:             break;
                    192:         case DID_MNONE:
                    193:             UpdMsgsLBSels (0, FALSE);
                    194:             break;
                    195:         case DID_MCON:
                    196:             UpdMsgsLBSels (MSGI_KEY, TRUE);
                    197:             break;
                    198:         case DID_MCOFF:
                    199:             UpdMsgsLBSels (MSGI_KEY, FALSE);
                    200:             break;
                    201:         case DID_MMON:
                    202:             UpdMsgsLBSels (MSGI_MOUSE, TRUE);
                    203:             break;
                    204:         case DID_MMOFF:
                    205:             UpdMsgsLBSels (MSGI_MOUSE, FALSE);
                    206:             break;
                    207:         case DID_MFON:
                    208:             UpdMsgsLBSels (MSGI_FREQ, TRUE);
                    209:             break;
                    210:         case DID_MFOFF:
                    211:             UpdMsgsLBSels (MSGI_FREQ, FALSE);
                    212:             break;
                    213:         }
                    214:         break;
                    215: 
                    216:     default:
                    217:         /*
                    218:          * Default is to see if the listbox has changed its focus
                    219:          * item number.  If it has, then we want to display the information
                    220:          * about the window that the listbox cursor is over.  There is no
                    221:          * legal way to do this, except to temporarily put the listbox into
                    222:          * single selection mode and query the selection.
                    223:          */
                    224:         if (fTrackingListBox && (hwndMessageLB != NULL)) {
                    225:             WinSetWindowBits(hwndMessageLB, QWL_STYLE, 0L, LS_MULTIPLESEL);
                    226:             iItemFocus = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION,
                    227:                     (MPARAM)LIT_FIRST, 0L);
                    228:             WinSetWindowBits(hwndMessageLB, QWL_STYLE, LS_MULTIPLESEL,
                    229:                     LS_MULTIPLESEL);
                    230:             if (iItemFocus != iCurItemFocus) {
                    231:                 iCurItemFocus = iItemFocus;
                    232:                 UpdateMsgBoxCurMsgText(hwnd);
                    233:             }
                    234:         }
                    235:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    236:         break;
                    237:     }
                    238:     return 0L;
                    239: }
                    240: 
                    241: 
                    242: 
                    243: /***************************** Private Function ****************************\
                    244: * void UpdateMsgBoxCurMsgText()
                    245: *
                    246: * Effects:
                    247: *   Updates the text that is displayed in the message text line
                    248: *
                    249: * History:
                    250: *   27-September-1988 KurtE
                    251: \***************************************************************************/
                    252: void UpdateMsgBoxCurMsgText(hwndDlg)
                    253: HWND    hwndDlg;
                    254: {
                    255:     SHORT   sMsgI;
                    256:     char    szTemp[80];
                    257: 
                    258: 
                    259:     if (iCurItemFocus >= 0) {
                    260:         /* Get the messge index */
                    261:         sMsgI = (SHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
                    262:                 (MPARAM)iCurItemFocus, 0L);
                    263:         sprintf(szTemp, "0x%04x  - %s", rgmsgi[sMsgI].msg,
                    264:                 rgmsgi[sMsgI].szMsg);
                    265:         WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)szTemp);
                    266:     } else {
                    267:         WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)"");
                    268:     }
                    269: 
                    270: }
                    271: 
                    272: 
                    273: 
                    274: 
                    275: /***************************** Private Function ****************************\
                    276: * void SelectMessageFromText(hwndDlg)
                    277: *
                    278: * Effects:
                    279: *   Updates the text that is displayed in the message text line
                    280: *
                    281: * History:
                    282: *   27-September-1988 KurtE
                    283: \***************************************************************************/
                    284: void SelectMessageFromText(hwndDlg)
                    285: HWND    hwndDlg;
                    286: {
                    287:     char    szTemp[80];
                    288:     USHORT  msg;
                    289:     MSGI    *pmsgi;
                    290:     int     i;
                    291: 
                    292: 
                    293:     /* First get the edit text from the string */
                    294:     WinQueryDlgItemText(hwndDlg, DID_MSGEDIT, sizeof(szTemp),
                    295:             (PSZ)szTemp);
                    296: 
                    297:     if ((msg = UConvertStringToNum(szTemp)) != 0xffff) {
                    298: 
                    299:         /* We have a number, now try to find message in message table */
                    300:         pmsgi = PmsgiFromMsg(msg);
                    301: 
                    302:     } else {
                    303:         /* Assume String, Try to locate string in our table */
                    304:         pmsgi = rgmsgi; /* Start at beginning of table */
                    305:         /*
                    306:          * This does simple string compares, it does not map case, nor
                    307:          * does it trim the string.
                    308:          */
                    309:         for (i=0; i < cmsgi; i++) {
                    310:             if (strcmpi(pmsgi->szMsg, szTemp) == 0)
                    311:                 break;
                    312:             pmsgi++;
                    313:         };
                    314: 
                    315:         if (i >= cmsgi)
                    316:             pmsgi = NULL;
                    317:     }
                    318: 
                    319:     /*
                    320:      * Have a pointer to MSGI of message, or NULL if not in list.
                    321:      */
                    322:     if(pmsgi != NULL) {
                    323:         /* First make sure it is visible */
                    324:         WinSendMsg(hwndMessageLB, LM_SETTOPINDEX,
                    325:                 MPFROMSHORT(pmsgi->iListBox),  (MPARAM)0L);
                    326: 
                    327:         /* Always set it on */
                    328:         WinSendMsg(hwndMessageLB, LM_SELECTITEM,
                    329:                 MPFROMSHORT(pmsgi->iListBox), MPFROMSHORT(TRUE));
                    330: 
                    331:     } else {
                    332:         WinAlarm(HWND_DESKTOP, WA_WARNING);
                    333:         WinSetDlgItemText(hwndDlg, DID_MSGEDIT, (PSZ)"");
                    334:     }
                    335: }
                    336: 
                    337: 
                    338: 
                    339: 
                    340: 
                    341: /**************************** Public Function ******************************\
                    342: * void UpdMsgsLBSels (USHORT uMask, fOnOrOff);
                    343: *
                    344: * Effects: Will update the selected items in the message listbox, that is
                    345: *   displayed in the options dialog
                    346: *
                    347: * Return value: none
                    348: \***************************************************************************/
                    349: void UpdMsgsLBSels (uMask, fOnOrOff)
                    350: USHORT      uMask;
                    351: BOOL        fOnOrOff;
                    352: {
                    353: 
                    354:     SHORT       i;
                    355:     MSGI        *pmsgi;
                    356: 
                    357:     /*
                    358:      * Loop through all of the items in our list, if the mask is 0 or
                    359:      * the bit is on in the item, then update the select state in listbox
                    360:      * defined in our message table
                    361:      */
                    362:     fTrackingListBox = FALSE;
                    363:     pmsgi = rgmsgi; /* Point to start of list */
                    364:     for (i = 0; i < cmsgi; i++) {
                    365:         if ((uMask == 0) || (pmsgi->wOptions & uMask)) {
                    366:             WinSendMsg(hwndMessageLB, LM_SELECTITEM,
                    367:         (MPARAM)pmsgi->iListBox,  (MPARAM)fOnOrOff);
                    368:         }
                    369:         pmsgi++;
                    370:     }
                    371:     fTrackingListBox = TRUE;
                    372: }
                    373: 
                    374: 
                    375: 
                    376: /**************************** Public Function ******************************\
                    377: * void UpdMsgsLBSels (HWND hwndDialog, USHORT uMask, fOnOrOff);
                    378: *
                    379: * Effects: Will update the selected items in the message listbox, that is
                    380: *   displayed in the options dialog
                    381: *
                    382: * Return value: none
                    383: \***************************************************************************/
                    384: void UpdMsgTblFromLB (hwndDialog)
                    385: HWND            hwndDialog;
                    386: {
                    387: 
                    388:     USHORT       i;
                    389:     register MSGI *pmsgi;
                    390:     USHORT      itemSel;
                    391: 
                    392:     /*
                    393:      * Loop through all of the items in the list and update the selection
                    394:      * status depending of if the item is selected in the list box or
                    395:      * not.
                    396:      */
                    397:     /* First simply turn off all of the bits */
                    398:     pmsgi = rgmsgi;
                    399:     for (i = 0; i < cmsgi; i++) {
                    400:         pmsgi->wOptions &= ~MSGI_ENABLED;
                    401:         pmsgi++;
                    402:     }
                    403: 
                    404:     /* Then turn on all of the selected items */
                    405:     itemSel = (USHORT)LIT_FIRST;
                    406: 
                    407:     while ((itemSel = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYSELECTION,
                    408:             (MPARAM)itemSel, 0L)) != (USHORT)LIT_NONE) {
                    409: 
                    410:         /* The item handle contains index in our array */
                    411:         i = (USHORT)WinSendMsg(hwndMessageLB, LM_QUERYITEMHANDLE,
                    412:             (MPARAM)itemSel, 0L);
                    413: 
                    414:         rgmsgi[i].wOptions |= MSGI_ENABLED;
                    415:     }
                    416: 
                    417:     /* Get the Other message option from checkmark */
                    418:     spyopt.fDispOtherMsgs = ((BOOL)WinSendDlgItemMsg(hwndDialog, DID_OTHERMSGS,
                    419:             BM_QUERYCHECK, 0L, 0L));
                    420: 
                    421:     /* Now call function to update the hooks message list */
                    422:     UpdateHooksMsgTable();
                    423: }
                    424: 
                    425: 
                    426: 
                    427: 
                    428: /**************************** Public Function ******************************\
                    429: * void UpdateHooksMsgTable(void)
                    430: *
                    431: * Effects: Set the message bitmask to the hook, for interested messages.
                    432: *   displayed in the options dialog
                    433: *
                    434: * Return value: none
                    435: \***************************************************************************/
                    436: void  UpdateHooksMsgTable()
                    437: {
                    438:     MSGI            *pmsgi;
                    439:     UCHAR           rgb[MAXMSGFILTERBYTES];
                    440:     int             i;
                    441:     UCHAR           *prgb;
                    442:     unsigned char   mask;
                    443: 
                    444:     /*
                    445:      * First zero the bitmask
                    446:      */
                    447:     memset(rgb,'\0', MAXMSGFILTERBYTES);
                    448:     mask = 1;
                    449:     prgb = rgb;
                    450: 
                    451:     /*
                    452:      * Quick and dirty loop to set the bits
                    453:      */
                    454:     pmsgi = rgmsgi;
                    455:     for (i = 0; i <= MAXMSGFILTER; i++) {
                    456:         /* If enabled, set bit in bit table */
                    457: 
                    458:         if (pmsgi->msg == i) {
                    459:             if (pmsgi->wOptions & MSGI_ENABLED)
                    460:                 *prgb = pmsgi->bMPTypes | MP_ENABLED;
                    461: 
                    462:             pmsgi++;
                    463:         } else {
                    464:             /* Hole in range, set it true */
                    465:             *prgb |= mask;
                    466:         }
                    467: 
                    468:         prgb++;
                    469:     }
                    470: 
                    471:     /* Now call the hook function with the new mask */
                    472:     SpySetMessageList((char FAR *)rgb, spyopt.fDispOtherMsgs);
                    473: }
                    474: 
                    475: 
                    476: 
                    477: 
                    478: /**************************** Public Function ******************************\
                    479: * EnableOrDisableMsg(BOOL fEnable)
                    480: *
                    481: * Effects: Fastway to enable or disable a particular message code.  The one
                    482: *           that is currently selected in the output listbox.
                    483: *
                    484: * Return value: none
                    485: \***************************************************************************/
                    486: 
                    487: void EnableOrDisableMsg(fEnable)
                    488: BOOL            fEnable;
                    489: {
                    490:     USHORT      itemSel;
                    491:     char        szTemp[100];
                    492:     char        *psz;
                    493:     MSGI        *pmsgi;
                    494:     SHORT       i;
                    495: 
                    496:     itemSel = (USHORT)WinSendMsg(hwndSpyList, LM_QUERYSELECTION,
                    497:             (MPARAM)LIT_FIRST, 0L);
                    498:     if (itemSel == (USHORT)LIT_NONE)
                    499:         return;    /* None to process */
                    500: 
                    501:     /* Get the message text */
                    502:     WinSendMsg(hwndSpyList, LM_QUERYITEMTEXT,
                    503:             MPFROM2SHORT(itemSel, sizeof(szTemp)), (MPARAM)(PSZ)szTemp);
                    504: 
                    505:     /* Now lets extract the messgae string from the line */
                    506:     psz = &szTemp[3];
                    507:     while (*psz != ' ')
                    508:         psz++;    /* locate first blank */
                    509:     *psz = '\0';    /* Zero terminate string */
                    510: 
                    511: 
                    512:     /*
                    513:      * Loop through all of the items in our list, until we find a
                    514:      * string that matches our string.
                    515:      */
                    516:     pmsgi = rgmsgi; /* Point to start of list */
                    517:     for (i = 0; i < cmsgi; i++) {
                    518:         if (strcmpi(&szTemp[2], pmsgi->szMsg) == 0) {
                    519:             /*
                    520:              * Found our message, update the bit of the message, and
                    521:              * call the function to let the hook know the new results
                    522:              */
                    523:             if (fEnable)
                    524:                 pmsgi->wOptions |= MSGI_ENABLED;
                    525:             else
                    526:                 pmsgi->wOptions &= ~MSGI_ENABLED;
                    527: 
                    528:                UpdateHooksMsgTable();      /* Set Spys Msg table */
                    529:             return;
                    530:         }
                    531:         pmsgi++;
                    532:     }
                    533: }
                    534: 
                    535: 
                    536: /**************************** Public Function ******************************\
                    537: * MRESULT SendMsgDlgProc(...)
                    538: *
                    539: * Effects: This is the dialog procedure for the Send Message facility of spy
                    540: *
                    541: * Return value: none
                    542: \***************************************************************************/
                    543: extern MRESULT EXPENTRY SendMsgDlgProc(hwnd, msg, mp1, mp2)
                    544: HWND    hwnd;
                    545: USHORT  msg;
                    546: MPARAM  mp1;
                    547: MPARAM  mp2;
                    548: {
                    549: 
                    550: 
                    551:     switch (msg) {
                    552: 
                    553:     case WM_INITDLG:
                    554:         break;
                    555: 
                    556:     case WM_COMMAND:
                    557:         SendMsgProcCmd(hwnd, LOUSHORT(mp1));
                    558:         break;
                    559: 
                    560:     default:
                    561:         return(WinDefDlgProc(hwnd, msg, mp1, mp2));
                    562:         break;
                    563:     }
                    564: 
                    565:     return 0L;
                    566: }
                    567: 
                    568: 
                    569: void SendMsgProcCmd(hwnd, id)
                    570: HWND    hwnd;
                    571: USHORT  id;
                    572: {
                    573:     HWND hwndPoint;
                    574:     BOOL fPostMsg;
                    575:     USHORT msg;
                    576:     MPARAM mp1;
                    577:     MPARAM mp2;
                    578:     MRESULT mresult;
                    579:     char szLine1[80];
                    580:     char szLine2[80];
                    581:     char szTemp[12];
                    582: 
                    583: 
                    584:     fPostMsg = TRUE;
                    585: 
                    586:     switch (id) {
                    587:     case DID_SELHWND:
                    588:         //  Call function to allow the user to point at a window.
                    589:         hwndPoint = HwndSelWinWithMouse(hwnd, NULL, FALSE);
                    590:         sprintf(szTemp, "%p", hwndPoint);
                    591:         WinSetDlgItemText(hwnd, DID_HWND, (PSZ)szTemp);
                    592:         break;
                    593: 
                    594:     case DID_SEND:
                    595:         fPostMsg = FALSE;
                    596:     case DID_POST:
                    597:         /* Send or post, setup to send the message */
                    598:         /* First setup the Hwnd */
                    599:         hwndPoint = (HWND)GetItemVal(hwnd, DID_HWND, FALSE, szLine1, szLine2);
                    600:         sprintf(szTemp, "%p", hwndPoint);
                    601:         WinSetDlgItemText(hwnd, DID_HWND, (PSZ)szTemp);
                    602: 
                    603:         /* Now the MSG */
                    604:         msg = (USHORT)GetItemVal(hwnd, DID_COMMAND, TRUE, szLine1, szLine2);
                    605:         SetItemHexNum(hwnd, DID_COMMAND, (ULONG)msg);
                    606: 
                    607:         /* Now the mp1 */
                    608:         mp1 = (MPARAM)GetItemVal(hwnd, DID_MPARAM1, TRUE, szLine1, szLine2);
                    609:         SetItemHexNum(hwnd, DID_MPARAM1, (ULONG)mp1);
                    610: 
                    611:         /* Now the mp2 */
                    612:         mp2 = (MPARAM)GetItemVal(hwnd, DID_MPARAM2, TRUE, szLine1, szLine2);
                    613:         SetItemHexNum(hwnd, DID_MPARAM2, (ULONG)mp2);
                    614: 
                    615:         /* Get initial values of two string variables */
                    616:         WinQueryDlgItemText(hwnd, DID_STRING1, sizeof(szLine1), (PSZ)szLine1);
                    617:         WinQueryDlgItemText(hwnd, DID_STRING2, sizeof(szLine2), (PSZ)szLine2);
                    618: 
                    619:         /* Now Send or post the message */
                    620:         if (fPostMsg)
                    621:             mresult = (MRESULT)WinPostMsg(hwndPoint, msg, mp1, mp2);
                    622:         else
                    623:             mresult = WinSendMsg(hwndPoint, msg, mp1, mp2);
                    624: 
                    625:         SetItemHexNum(hwnd, DID_RESULT, (ULONG)mresult);
                    626: 
                    627:         /* Set the Ending values for the strings */
                    628:         WinSetDlgItemText(hwnd, DID_STRING1, (PSZ)szLine1);
                    629:         WinSetDlgItemText(hwnd, DID_STRING2, (PSZ)szLine2);
                    630:         break;
                    631: 
                    632:     case DID_CANCEL:
                    633:         WinDismissDlg(hwnd, 1234);
                    634:         WinDestroyWindow(hwnd);
                    635:         WinSendMsg(WinWindowFromID(hwndSpyFrame, FID_MENU),
                    636:             MM_SETITEMATTR, MPFROM2SHORT(CMD_SENDMSG, TRUE),
                    637:             MPFROM2SHORT(MIA_DISABLED, 0));
                    638: 
                    639:         break;
                    640:     }
                    641: }
                    642: 
                    643: void SetItemHexNum(hwnd, idItem, lVal)
                    644: HWND    hwnd;
                    645: USHORT  idItem;
                    646: ULONG    lVal;
                    647: {
                    648:     char    szTemp[20];
                    649: 
                    650:     sprintf (szTemp, "0x%lx", lVal);
                    651:     WinSetDlgItemText(hwnd, idItem, (PSZ)szTemp);
                    652: }
                    653: 
                    654: ULONG GetItemVal(hwnd, idItem, fLookup, psz1, psz2)
                    655: HWND    hwnd;
                    656: USHORT  idItem;
                    657: BOOL    fLookup;
                    658: PSZ     psz1;
                    659: PSZ     psz2;
                    660: {
                    661:     ULONG   lVal;
                    662:     char    szTemp[80];
                    663:     register char *psz;
                    664:     MSGI    *pmsgi;
                    665:     SHORT   i;
                    666:     USHORT  usSel;
                    667:     USHORT  usOffset;
                    668: 
                    669:     WinQueryDlgItemText(hwnd, idItem, sizeof(szTemp), (PSZ)szTemp);
                    670: 
                    671:     /* Quick and dirty convert string to uppercase */
                    672:     for (psz = szTemp; *psz; psz++) {
                    673:         if ((*psz >= 'a') && (*psz <= 'z'))
                    674:             *psz = *psz - 'a' + 'A';
                    675:     }
                    676: 
                    677:     if (fLookup) {
                    678:         // Try to find the string in our table.
                    679:         pmsgi = rgmsgi; /* Start at beginning of table */
                    680:         /*
                    681:          * This does simple string compares, it does not map case, nor
                    682:          * does it trim the string.
                    683:          */
                    684:         for (i=0; i < cmsgi; i++) {
                    685:             if (strcmpi(pmsgi->szMsg, szTemp) == 0)
                    686:                 break;
                    687:             pmsgi++;
                    688:         }
                    689: 
                    690:         if (i < cmsgi)
                    691:             return ((ULONG)pmsgi->msg);
                    692: 
                    693:     }
                    694: 
                    695:     /* Simple Test for &1 and &2 */
                    696:     if (szTemp[0] == '&') {
                    697:         if (szTemp[1] == '2')
                    698:             return ((LONG)psz2);
                    699:         else
                    700:             return ((LONG)psz1);
                    701:     }
                    702: 
                    703:     // Now test for pointers to convert
                    704:     if (strchr(szTemp, ':') != NULL) {
                    705:         // This NEEDS to be rewritten!!!!!
                    706:         usOffset = 0;
                    707:         for (psz = szTemp; *psz; psz++) {
                    708:             if ((*psz >= '0') && (*psz <= '9'))
                    709:                 usOffset = (usOffset << 4) + (USHORT)(*psz - '0');
                    710:             else if ((*psz >= 'A') && (*psz <= 'F'))
                    711:                 usOffset = (usOffset << 4) + (USHORT)(*psz - 'A' + 10 );
                    712:             else if (*psz == ':') {
                    713:                 usSel = usOffset;
                    714:                 usOffset = 0;
                    715:             }
                    716:             else
                    717:                 break;
                    718:         }
                    719: 
                    720:         // Finally return the value
                    721:         return (MAKEULONG(usOffset, usSel));
                    722: 
                    723:     }
                    724: 
                    725:     /* Quick and Dirty conversion functions */
                    726:     lVal = 0;
                    727:     if (szTemp[0] == '0' && szTemp[1] == 'X') {
                    728:         /* Hex values */
                    729:         for (psz = &szTemp[2]; *psz; psz++) {
                    730:             if ((*psz >= '0') && (*psz <= '9'))
                    731:                 lVal = (lVal << 4) + (ULONG)(*psz - '0');
                    732:             else if ((*psz >= 'A') && (*psz <= 'F'))
                    733:                 lVal = (lVal << 4) + (ULONG)(*psz - 'A' + 10 );
                    734:             else
                    735:                 return (lVal);
                    736:         }
                    737: 
                    738:     } else {
                    739:         /* Base 10 */
                    740:         for (psz = szTemp; *psz; psz++) {
                    741:             if ((*psz >= '0') && (*psz <= '9'))
                    742:                 lVal = lVal * 10 + (ULONG)(*psz - '0');
                    743:             else
                    744:                 return (lVal);
                    745:         }
                    746:     }
                    747: 
                    748:     return (lVal);
                    749: }
                    750: 
                    751: 

unix.superglobalmegacorp.com

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