Annotation of q_a/samples/hooks/hooktest.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: #include <windows.h>    // includes basic windows functionality
                     13: #include <stdio.h>      // includes standard file i/o functionality
                     14: #include <string.h>     // includes string functions
                     15: #include "hooktest.h"
                     16: 
                     17: #define NUMHOOKS 7
                     18: 
                     19: /* Global variables */
                     20: 
                     21: typedef struct _MYHOOKDATA {
                     22:     int nType;
                     23:     HOOKPROC hkprc;
                     24:     HHOOK hhook;
                     25: } MYHOOKDATA;
                     26: 
                     27: MYHOOKDATA myhookdata[NUMHOOKS];
                     28: 
                     29: HWND         hwndMain;
                     30: HANDLE       hInst;
                     31: 
                     32: 
                     33: /****************************************************************************
                     34: *
                     35: *    FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
                     36: *
                     37: *    PURPOSE: calls initialization function, processes message loop
                     38: *
                     39: *    COMMENTS:
                     40: *
                     41: *
                     42: ****************************************************************************/
                     43: 
                     44: int APIENTRY WinMain(
                     45:     HINSTANCE hInstance,
                     46:     HINSTANCE hPrevInstance,
                     47:     LPSTR lpCmdLine,
                     48:     int nCmdShow
                     49:     )
                     50: {
                     51: 
                     52:     MSG msg;                         /* message                      */
                     53: 
                     54:         if (!InitApplication(hInstance)) /* Initialize shared things */
                     55:             return (FALSE);              /* Exits if unable to initialize     */
                     56: 
                     57:     hInst = hInstance;
                     58: 
                     59:     /* Perform initializations that apply to a specific instance */
                     60: 
                     61:     if (!InitInstance(hInstance, nCmdShow))
                     62:         return (FALSE);
                     63: 
                     64:     // register window message for FindText() and ReplaceText() hook procs
                     65:     /* Acquire and dispatch messages until a WM_QUIT message is received. */
                     66: 
                     67:     while (GetMessage(&msg,        /* message structure                      */
                     68:             NULL,                  /* handle of window receiving the message */
                     69:             0,                     /* lowest message to examine              */
                     70:             0))                    /* highest message to examine             */
                     71:         {
                     72:         TranslateMessage(&msg);    /* Translates virtual key codes           */
                     73:         DispatchMessage(&msg);     /* Dispatches message to window           */
                     74:     }
                     75:     return (msg.wParam);           /* Returns the value from PostQuitMessage */
                     76: 
                     77:     // avoid compiler warnings at W3
                     78:     lpCmdLine;
                     79:     hPrevInstance;
                     80: }
                     81: 
                     82: 
                     83: /****************************************************************************
                     84: *
                     85: *    FUNCTION: InitApplication(HANDLE)
                     86: *
                     87: *    PURPOSE: Initializes window data and registers window class
                     88: *
                     89: *    COMMENTS:
                     90: *
                     91: *        In this function, we initialize a window class by filling out a data
                     92: *        structure of type WNDCLASS and calling the Windows RegisterClass()
                     93: *        function.
                     94: *
                     95: ****************************************************************************/
                     96: 
                     97: BOOL InitApplication(HANDLE hInstance)       /* current instance             */
                     98: {
                     99:     WNDCLASS  wc;
                    100: 
                    101:     /* Fill in window class structure with parameters that describe the       */
                    102:     /* main window.                                                           */
                    103: 
                    104:     wc.style = 0;                       /* Class style(s).                    */
                    105:     wc.lpfnWndProc = (WNDPROC)MainWndProc;       /* Function to retrieve messages for  */
                    106:                                         /* windows of this class.             */
                    107:     wc.cbClsExtra = 0;                  /* No per-class extra data.           */
                    108:     wc.cbWndExtra = 0;                  /* No per-window extra data.          */
                    109:     wc.hInstance = hInstance;           /* Application that owns the class.   */
                    110:     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
                    111:     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                    112:     wc.hbrBackground = GetStockObject(WHITE_BRUSH); 
                    113:     wc.lpszMenuName =  "HookMenu";   /* Name of menu resource in .RC file. */
                    114:     wc.lpszClassName = "HookWClass"; /* Name used in call to CreateWindow. */
                    115: 
                    116:     /* Register the window class and return success/failure code. */
                    117: 
                    118:     return (RegisterClass(&wc));
                    119: 
                    120: }
                    121: 
                    122: 
                    123: /****************************************************************************
                    124: *
                    125: *    FUNCTION:  InitInstance(HANDLE, int)
                    126: *
                    127: *    PURPOSE:  Saves instance handle and creates main window
                    128: *
                    129: *    COMMENTS:
                    130: *
                    131: *        In this function, we save the instance handle in a static variable and
                    132: *        create and display the main program window.
                    133: *
                    134: ****************************************************************************/
                    135: 
                    136: BOOL InitInstance(
                    137:     HANDLE          hInstance,          /* Current instance identifier.       */
                    138:     int             nCmdShow)           /* Param for first ShowWindow() call. */
                    139: {
                    140: 
                    141:     /* Save the instance handle in static variable, which will be used in  */
                    142:     /* many subsequence calls from this application to Windows.            */
                    143: 
                    144:     hInst = hInstance;
                    145: 
                    146:     /* Create a main window for this application instance.  */
                    147: 
                    148:     hwndMain = CreateWindow(
                    149:         "HookWClass",                 /* See RegisterClass() call.          */
                    150:         "Hooks Sample Application",   /* Text for window title bar.         */
                    151:         WS_OVERLAPPEDWINDOW,            /* Window style.                      */
                    152:         CW_USEDEFAULT,                  /* Default horizontal position.       */
                    153:         CW_USEDEFAULT,                  /* Default vertical position.         */
                    154:         CW_USEDEFAULT,                  /* Default width.                     */
                    155:         CW_USEDEFAULT,                  /* Default height.                    */
                    156:         NULL,                           /* Overlapped windows have no parent. */
                    157:         NULL,                           /* Use the window class menu.         */
                    158:         hInstance,                      /* This instance owns this window.    */
                    159:         NULL                            /* Pointer not needed.                */
                    160:     );
                    161: 
                    162:     /* If window could not be created, return "failure" */
                    163: 
                    164:     if (!hwndMain)
                    165:         return (FALSE);
                    166: 
                    167:     /* Make the window visible; update its client area; and return "success" */
                    168: 
                    169:     ShowWindow(hwndMain, nCmdShow);  /* Show the window                        */
                    170:     UpdateWindow(hwndMain);          /* Sends WM_PAINT message                 */
                    171:     return (TRUE);               /* Returns the value from PostQuitMessage */
                    172: 
                    173: }
                    174: 
                    175: /****************************************************************************
                    176: *
                    177: *    FUNCTION: MainWndProc(HWND, unsigned, WORD, LONG)
                    178: *
                    179: *    PURPOSE:  Processes messages
                    180: *
                    181: *    COMMENTS:
                    182: *
                    183: *        This function processes all messages sent to the window.  When the
                    184: *        user chooses one of the options from one of the menus, the command
                    185: *        is processed here and passed onto the function for that command.
                    186: *        This function also processes the special "FindReplace" message that
                    187: *        this application registers for hook processing of the FindText()
                    188: *        and ReplaceText() common dialog functions.
                    189: *
                    190: ****************************************************************************/
                    191: 
                    192: 
                    193: 
                    194: LONG APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam)
                    195: HWND hwndMain;
                    196: UINT uMsg;
                    197: UINT wParam;
                    198: LONG lParam;
                    199: {
                    200:     static BOOL aHooks[NUMHOOKS];
                    201:     int index;
                    202:     static HMENU hmenu;
                    203: 
                    204: 
                    205:     switch (uMsg) {
                    206:         case WM_CREATE:
                    207: 
                    208:             /* Save the menu handle. */
                    209: 
                    210:             hmenu = GetMenu(hwndMain);
                    211: 
                    212:             /*
                    213:              * Initialize structures with hook data. The menu-item
                    214:              * identifiers are defined as 0 through 6 in the
                    215:              * header file. They can be used to identify array
                    216:              * elements both here and during the WM_COMMAND
                    217:              * message.
                    218:              */
                    219: 
                    220:             myhookdata[IDM_CALLWNDPROC].nType = WH_CALLWNDPROC;
                    221:             myhookdata[IDM_CALLWNDPROC].hkprc = CallWndProc;
                    222: 
                    223:             myhookdata[IDM_CBT].nType = WH_CBT;
                    224:             myhookdata[IDM_CBT].hkprc = CBTProc;
                    225:             myhookdata[IDM_DEBUG].nType = WH_DEBUG;
                    226:             myhookdata[IDM_DEBUG].hkprc = DebugProc;
                    227:             myhookdata[IDM_GETMESSAGE].nType = WH_GETMESSAGE;
                    228:             myhookdata[IDM_GETMESSAGE].hkprc = GetMsgProc;
                    229:             myhookdata[IDM_KEYBOARD].nType = WH_KEYBOARD;
                    230: 
                    231:             myhookdata[IDM_KEYBOARD].hkprc = KeyboardProc;
                    232:             myhookdata[IDM_MOUSE].nType = WH_MOUSE;
                    233:             myhookdata[IDM_MOUSE].hkprc = MouseProc;
                    234:             myhookdata[IDM_MSGFILTER].nType = WH_MSGFILTER;
                    235:             myhookdata[IDM_MSGFILTER].hkprc = MessageProc;
                    236: 
                    237:             /* Initialize all flags in the array to FALSE. */
                    238:             memset(aHooks, FALSE, sizeof(aHooks));
                    239: 
                    240:             return 0;
                    241: 
                    242:         case WM_COMMAND:
                    243: 
                    244:             switch (LOWORD(wParam)) {
                    245: 
                    246:                 case IDM_EXIT:
                    247:                     PostQuitMessage(0);
                    248:                     break;
                    249: 
                    250:                 /*
                    251:                  * The user selected a hook command from the menu.
                    252:                  */
                    253: 
                    254:                 case IDM_CALLWNDPROC:
                    255:                 case IDM_CBT:
                    256:                 case IDM_DEBUG:
                    257:                 case IDM_GETMESSAGE:
                    258:                 case IDM_KEYBOARD:
                    259:                 case IDM_MOUSE:
                    260:                 case IDM_MSGFILTER:
                    261: 
                    262:                     /*
                    263:                      * Use the menu-item identifier as an index
                    264:                      * into the array of structures with hook data.
                    265: 
                    266:                      */
                    267: 
                    268:                     index = LOWORD(wParam);
                    269: 
                    270:                     /*
                    271:                      * If the selected type of hook procedure isn't
                    272:                      * installed yet, install it and check the
                    273:                      * associated menu item.
                    274:                      */
                    275: 
                    276:                     if (!aHooks[index]) {
                    277:                         myhookdata[index].hhook = SetWindowsHookEx(
                    278:                             myhookdata[index].nType,
                    279:                             myhookdata[index].hkprc,
                    280:                             (HINSTANCE) NULL, GetCurrentThreadId());
                    281:                         CheckMenuItem(hmenu, index,
                    282:                             MF_BYCOMMAND | MF_CHECKED);
                    283:                         aHooks[index] = TRUE;
                    284:                     }
                    285: 
                    286:                     /*
                    287:                      * If the selected type of hook procedure is
                    288:                      * already installed, remove it and remove the
                    289:                      * check mark from the associated menu item.
                    290:                      */
                    291: 
                    292: 
                    293:                     else {
                    294:                         UnhookWindowsHookEx(myhookdata[index].hhook);
                    295:                         CheckMenuItem(hmenu, index,
                    296:                             MF_BYCOMMAND | MF_UNCHECKED);
                    297:                         aHooks[index] = FALSE;
                    298:                         InvalidateRect(hwndMain, NULL, TRUE);
                    299:                         UpdateWindow(hwndMain);
                    300:                     }
                    301: 
                    302:            }
                    303:             break;
                    304: 
                    305:              case WM_DESTROY:
                    306:                  PostQuitMessage(0);
                    307:                  break;
                    308: 
                    309:         default:
                    310:             return DefWindowProc(hwndMain, uMsg, wParam, lParam);
                    311:     }
                    312:     return 0;
                    313: }
                    314: 
                    315: /****************************************************************
                    316:   WH_CALLWNDPROC hook procedure
                    317:  ****************************************************************/
                    318: 
                    319: LRESULT CALLBACK CallWndProc(nCode, wParam, lParam)
                    320: int nCode;
                    321: WPARAM wParam;
                    322: LPARAM lParam;
                    323: {
                    324:     CHAR szCWPBuf[256];
                    325:     HDC hdc;
                    326: 
                    327:     static int c = 0;
                    328:     int cch;
                    329: 
                    330:     if (nCode < 0)  /* do not process message */
                    331:         return CallNextHookEx(myhookdata[IDM_CALLWNDPROC].hhook, nCode,
                    332:                 wParam, lParam);
                    333: 
                    334:     hdc = GetDC(hwndMain);
                    335: 
                    336:     switch (nCode) {
                    337:         case HC_ACTION:
                    338:             cch = wsprintf(szCWPBuf,
                    339:                "CALLWNDPROC - tsk: %ld, msg: %d, %d times %20s",
                    340:                 wParam, nCode, c++, "" );
                    341:             TextOut(hdc, 2, 15, szCWPBuf, cch);
                    342:             break;
                    343: 
                    344:         default:
                    345:             break;
                    346:     }
                    347: 
                    348:     ReleaseDC(hwndMain, hdc);
                    349:     return CallNextHookEx(myhookdata[IDM_CALLWNDPROC].hhook, nCode,
                    350:         wParam, lParam);
                    351: }
                    352: 
                    353: /****************************************************************
                    354:   WH_GETMESSAGE hook procedure
                    355:  ****************************************************************/
                    356: 
                    357: LRESULT CALLBACK GetMsgProc(nCode, wParam, lParam)
                    358: int nCode;
                    359: WPARAM wParam;
                    360: 
                    361: LPARAM lParam;
                    362: {
                    363:     CHAR szMSGBuf[256];
                    364:     CHAR szRem[16];
                    365:     HDC hdc;
                    366:     static int c = 0;
                    367:     int cch;
                    368: 
                    369:     if (nCode < 0) /* do not process message */
                    370:         return CallNextHookEx(myhookdata[IDM_GETMESSAGE].hhook, nCode,
                    371:             wParam, lParam);
                    372: 
                    373:     switch (nCode) {
                    374:         case HC_ACTION:
                    375:             switch (wParam) {
                    376:                 case PM_REMOVE:
                    377:                     lstrcpy(szRem, "PM_REMOVE");
                    378:                     break;
                    379: 
                    380:                 case PM_NOREMOVE:
                    381:                     lstrcpy(szRem, "PM_NOREMOVE");
                    382:                     break;
                    383: 
                    384:                 default:
                    385:                     lstrcpy(szRem, "Unknown");
                    386:                     break;
                    387:             }
                    388: 
                    389:             hdc = GetDC(hwndMain);
                    390: 
                    391:             cch = wsprintf(szMSGBuf,
                    392:                 "GETMESSAGE - wParam: %s, msg: %d, %d times %20s",
                    393:                 szRem, nCode, c++, "");
                    394:             TextOut(hdc, 2, 35, szMSGBuf, cch);
                    395:             break;
                    396: 
                    397:         default:
                    398:             break;
                    399:     }
                    400: 
                    401:     ReleaseDC(hwndMain, hdc);
                    402:     return CallNextHookEx(myhookdata[IDM_GETMESSAGE].hhook, nCode,
                    403:         wParam, lParam);
                    404: }
                    405: 
                    406: /****************************************************************
                    407:   WH_DEBUG hook procedure
                    408:  ****************************************************************/
                    409: 
                    410: LRESULT CALLBACK DebugProc(nCode, wParam, lParam)
                    411: 
                    412: int nCode;
                    413: WPARAM wParam;
                    414: LPARAM lParam;
                    415: {
                    416:     CHAR szBuf[128];
                    417:     HDC hdc;
                    418:     static int c = 0;
                    419:     int cch;
                    420: 
                    421:     if (nCode < 0)  /* do not process message */
                    422:         return CallNextHookEx(myhookdata[IDM_DEBUG].hhook, nCode,
                    423:             wParam, lParam);
                    424: 
                    425:     hdc = GetDC(hwndMain);
                    426: 
                    427:     switch (nCode) {
                    428:         case HC_ACTION:
                    429:             cch = wsprintf(szBuf,
                    430:                 "DEBUG - nCode: %d, tsk: %ld, %d times %20s",
                    431:                 nCode,wParam, c++, "");
                    432:             TextOut(hdc, 2, 55, szBuf, cch);
                    433:             break;
                    434: 
                    435:         default:
                    436:             break;
                    437:     }
                    438: 
                    439:     ReleaseDC(hwndMain, hdc);
                    440:     return CallNextHookEx(myhookdata[IDM_DEBUG].hhook, nCode, wParam,
                    441:         lParam);
                    442: }
                    443: 
                    444: /****************************************************************
                    445:   WH_CBT hook procedure
                    446:  ****************************************************************/
                    447: 
                    448: LRESULT CALLBACK CBTProc(nCode, wParam, lParam)
                    449: int nCode;
                    450: WPARAM wParam;
                    451: LPARAM lParam;
                    452: 
                    453: {
                    454:     CHAR szBuf[128];
                    455:     CHAR szCode[128];
                    456:     HDC hdc;
                    457:     static int c = 0;
                    458:     int cch;
                    459: 
                    460:     if (nCode < 0)  /* do not process message */
                    461:         return CallNextHookEx(myhookdata[IDM_CBT].hhook, nCode, wParam,
                    462:             lParam);
                    463: 
                    464:     hdc = GetDC(hwndMain);
                    465: 
                    466:     switch (nCode) {
                    467:         case HCBT_ACTIVATE:
                    468:             lstrcpy(szCode, "HCBT_ACTIVATE");
                    469:             break;
                    470: 
                    471:         case HCBT_CLICKSKIPPED:
                    472:             lstrcpy(szCode, "HCBT_CLICKSKIPPED");
                    473:             break;
                    474: 
                    475:         case HCBT_CREATEWND:
                    476:             lstrcpy(szCode, "HCBT_CREATEWND");
                    477:             break;
                    478: 
                    479:         case HCBT_DESTROYWND:
                    480:             lstrcpy(szCode, "HCBT_DESTROYWND");
                    481:             break;
                    482: 
                    483:         case HCBT_KEYSKIPPED:
                    484:             lstrcpy(szCode, "HCBT_KEYSKIPPED");
                    485:             break;
                    486: 
                    487:         case HCBT_MINMAX:
                    488:             lstrcpy(szCode, "HCBT_MINMAX");
                    489:             break;
                    490: 
                    491:         case HCBT_MOVESIZE:
                    492:             lstrcpy(szCode, "HCBT_MOVESIZE");
                    493:             break;
                    494: 
                    495:         case HCBT_QS:
                    496:             lstrcpy(szCode, "HCBT_QS");
                    497:             break;
                    498: 
                    499:         case HCBT_SETFOCUS:
                    500:             lstrcpy(szCode, "HCBT_SETFOCUS");
                    501:             break;
                    502: 
                    503:         case HCBT_SYSCOMMAND:
                    504: 
                    505:             lstrcpy(szCode, "HCBT_SYSCOMMAND");
                    506:             break;
                    507: 
                    508:         default:
                    509:             lstrcpy(szCode, "Unknown");
                    510:             break;
                    511:     }
                    512: 
                    513:     cch = wsprintf(szBuf, "CBT - nCode: %s, tsk: %ld, %d times %20s",
                    514:         szCode, wParam, c++, "");
                    515:     TextOut(hdc, 2, 75, szBuf, cch);
                    516:     ReleaseDC(hwndMain, hdc);
                    517:     return CallNextHookEx(myhookdata[IDM_CBT].hhook, nCode, wParam,
                    518:         lParam);
                    519: }
                    520: 
                    521: /****************************************************************
                    522:   WH_MOUSE hook procedure
                    523: 
                    524:  ****************************************************************/
                    525: 
                    526: LRESULT CALLBACK MouseProc(nCode, wParam, lParam)
                    527: int nCode;
                    528: WPARAM wParam;
                    529: LPARAM lParam;
                    530: {
                    531:     CHAR szBuf[128];
                    532:     HDC hdc;
                    533:     static int c = 0;
                    534:     int cch;
                    535: 
                    536:     if (nCode < 0)  /* do not process the message */
                    537:         return CallNextHookEx(myhookdata[IDM_MOUSE].hhook, nCode,
                    538:             wParam, lParam);
                    539: 
                    540: 
                    541:     hdc = GetDC(hwndMain);
                    542:     cch = wsprintf(szBuf,
                    543:         "MOUSE - nCode: %d, msg: %d, x: %d, y: %d, %d times %20s",
                    544:         nCode, nCode, LOWORD(lParam), HIWORD(lParam), c++, "" );
                    545:     TextOut(hdc, 2, 95, szBuf, cch);
                    546:     ReleaseDC(hwndMain, hdc);
                    547:     return CallNextHookEx(myhookdata[IDM_MOUSE].hhook, nCode, wParam,
                    548: 
                    549:         lParam);
                    550: }
                    551: 
                    552: /****************************************************************
                    553:   WH_KEYBOARD hook procedure
                    554:  ****************************************************************/
                    555: 
                    556: LRESULT CALLBACK KeyboardProc(nCode, wParam, lParam)
                    557: int nCode;
                    558: WPARAM wParam;
                    559: LPARAM lParam;
                    560: {
                    561:     CHAR szBuf[128];
                    562:     HDC hdc;
                    563:     static int c = 0;
                    564:     int cch;
                    565: 
                    566:     if (nCode < 0)  /* do not process message */
                    567:         return CallNextHookEx(myhookdata[IDM_KEYBOARD].hhook, nCode,
                    568:             wParam, lParam);
                    569: 
                    570:     hdc = GetDC(hwndMain);
                    571: 
                    572:     cch = wsprintf(szBuf, "KEYBOARD - nCode: %d, vk: %d, %d times %20s",
                    573:         nCode, wParam, c++, "" );
                    574:     TextOut(hdc, 2, 115, szBuf, cch);
                    575:     ReleaseDC(hwndMain, hdc);
                    576:     return CallNextHookEx(myhookdata[IDM_KEYBOARD].hhook, nCode, wParam,
                    577:         lParam);
                    578: }
                    579: 
                    580: /****************************************************************
                    581:   WH_MSGFILTER hook procedure
                    582:  ****************************************************************/
                    583: 
                    584: LRESULT CALLBACK MessageProc(nCode, wParam, lParam)
                    585: int nCode;
                    586: WPARAM wParam;
                    587: 
                    588: LPARAM lParam;
                    589: {
                    590:     CHAR szBuf[128];
                    591:     CHAR szCode[32];
                    592:     HDC hdc;
                    593:     static int c = 0;
                    594:     int cch;
                    595: 
                    596:     if (nCode < 0)  /* do not process message */
                    597:         return CallNextHookEx(myhookdata[IDM_MSGFILTER].hhook, nCode,
                    598:             wParam, lParam);
                    599: 
                    600:     switch (nCode) {
                    601:         case MSGF_DIALOGBOX:
                    602:             lstrcpy(szCode, "MSGF_DIALOGBOX");
                    603:             break;
                    604: 
                    605: 
                    606:         case MSGF_MENU:
                    607:             lstrcpy(szCode, "MSGF_MENU");
                    608:             break;
                    609: 
                    610:         case MSGF_SCROLLBAR:
                    611:             lstrcpy(szCode, "MSGF_SCROLLBAR");
                    612:             break;
                    613: 
                    614:         case MSGF_NEXTWINDOW:
                    615:             lstrcpy(szCode, "MSGF_NEXTWINDOW");
                    616:             break;
                    617: 
                    618:         default:
                    619:             wsprintf(szCode, "Unknown: %d", nCode);
                    620:             break;
                    621:     }
                    622: 
                    623:     hdc = GetDC(hwndMain);
                    624:     cch = wsprintf(szBuf,
                    625:         "MSGFILTER  nCode: %s, msg: %d, %d times %20s",
                    626:         szCode, nCode, c++, "" );
                    627:     TextOut(hdc, 2, 135, szBuf, cch);
                    628:     ReleaseDC(hwndMain, hdc);
                    629:     return CallNextHookEx(myhookdata[IDM_MSGFILTER].hhook, nCode,
                    630:         wParam, lParam);
                    631: }
                    632: 

unix.superglobalmegacorp.com

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