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