HOOK.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /******************************************************************************
  2. *       This is a part of the Microsoft Source Code Samples. 
  3. *       Copyright (C) 1993-1997 Microsoft Corporation.
  4. *       All rights reserved. 
  5. *       This source code is only intended as a supplement to 
  6. *       Microsoft Development Tools and/or WinHelp documentation.
  7. *       See these sources for detailed information regarding the 
  8. *       Microsoft samples programs.
  9. ******************************************************************************/
  10. /*****************************************************************************
  11. *
  12. * Module: hook.c
  13. *
  14. *   Contains the message hooking functions for the Windows debugging Spy
  15. *   SDK applet.
  16. *
  17. * Functions:
  18. *
  19. *   CreateHookThread()
  20. *   HookMain()
  21. *   HookWndProc()
  22. *   SetSpyHook()
  23. *   SetWindowToSpyOn()
  24. *   DbgPrintf()
  25. *
  26. * Comments:
  27. *
  28. *****************************************************************************/
  29. #include "spy.h"
  30. PRIVATE BOOL gfProcessHooks = TRUE;
  31. /*****************************************************************************
  32. * CreateHookThread
  33. *
  34. *    Creates the hook thread.
  35. *
  36. * Arguments: 
  37. *    none
  38. *
  39. * Returns:
  40. *    BOOL - Whether or not hook create succeeeded.
  41. *****************************************************************************/
  42. BOOL
  43. CreateHookThread(
  44.     VOID
  45.     )
  46. {
  47.     WNDCLASS wc;
  48.     DWORD Id;
  49.     //
  50.     // Register a class for the hook stuff to forward its messages to.
  51.     //
  52.     wc.hCursor        = NULL;    // this window never shown, so no
  53.     wc.hIcon          = NULL;    // cursor or icon are necessary
  54.     wc.lpszMenuName   = NULL;
  55.     wc.lpszClassName  = HOOKWINDOWCLASS;
  56.     wc.hbrBackground  = (HBRUSH)(COLOR_WINDOW + 1);
  57.     wc.hInstance      = ghInst;
  58.     wc.style          = 0;
  59.     wc.lpfnWndProc    = HookWndProc;
  60.     wc.cbWndExtra     = sizeof(HWND) + sizeof(HWND);
  61.     wc.cbClsExtra     = 0;
  62.     if (!RegisterClass(&wc))
  63.         return FALSE;
  64.     //
  65.     // Now create another thread to handle the new queue
  66.     //
  67.     if (!(ghHookThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)HookMain,
  68.         0L, STANDARD_RIGHTS_REQUIRED, &Id)))
  69.         return FALSE;
  70.     return TRUE;
  71. }
  72. /*****************************************************************************
  73. * HookMain
  74. *
  75. *    Main window procedure for the Hook window
  76. *
  77. *****************************************************************************/
  78. DWORD
  79. HookMain(
  80.     LPVOID lpv
  81.     )
  82. {
  83.     MSG msg;
  84.     //
  85.     // Create a hidden window for all to find, but not to see
  86.     //
  87.     ghwndSpyHook = CreateWindow(HOOKWINDOWCLASS, HOOKWINDOWNAME,
  88.         WS_OVERLAPPEDWINDOW,
  89.         0, 0, 0, 0,
  90.         (HWND) NULL,        /* no parent */
  91.         (HMENU) NULL,       /* use class menu */
  92.         (HANDLE) ghInst,    /* handle to window instance */
  93.         (LPSTR) NULL        /* no params to pass on */
  94.         );
  95.     if (!ghwndSpyHook)
  96.     {
  97.         ExitThread(0);
  98.     }
  99.     SetWindowToSpyOn(HWND_ALL);
  100.     //
  101.     // Polling forwarded messages from hook's event queue
  102.     //
  103.     while (IsWindow(ghwndSpyHook) && GetMessage(&msg, ghwndSpyHook, 0, 0))
  104.     {
  105.         if (gfProcessHooks)
  106.         {
  107.             TranslateMessage(&msg);
  108.             DispatchMessage(&msg);
  109.         }
  110.     }
  111.     ghwndSpyHook = NULL;
  112.     return 0; // not reached
  113. }
  114. /*****************************************************************************
  115. * HookWndProc
  116. *
  117. * Window procedure for the spy hook.
  118. *
  119. * Arguments:
  120. *   HWND hwnd - handle to the hook window.   
  121. *   UINT msg - message sent to hook window.
  122. *   WPARAM wParam - message parameter.
  123. *   LPARAM lParam - message parameter.
  124. *
  125. * Returns:
  126. *   The value that the proc should return, based on the processing
  127. *   of the specific WM_COMMAND message received.
  128. *****************************************************************************/
  129. LRESULT CALLBACK
  130. HookWndProc(
  131.     HWND hwnd,
  132.     UINT msg,
  133.     WPARAM wParam,
  134.     LPARAM lParam
  135.     )
  136. {
  137.     switch (msg)
  138.     {
  139.         //
  140.         // New message for Win32 - allows the application to pass data to another application.
  141.         //      
  142.         case WM_COPYDATA:
  143.             {
  144.                 MSG msgT;
  145.                 msgT.hwnd = (HWND)wParam;
  146.                 msgT.message = ((PCOPYDATASTRUCT)lParam)->dwData;
  147.                 msgT.wParam = ((PSPYMSGDATA)((PCOPYDATASTRUCT)lParam)->lpData)->wParam;
  148.                 msgT.lParam = ((PSPYMSGDATA)((PCOPYDATASTRUCT)lParam)->lpData)->lParam;
  149. //DbgPrintf("S Received Message hwnd:%8.8x msg:%d", msgT.hwnd, msgT.message);
  150.                 PrintMsg(&msgT);
  151. //DbgPrintf("S Printed Message hwnd:%8.8x msg:%d", msgT.hwnd, msgT.message);
  152.             }
  153.             return TRUE;
  154.         case WM_CREATE:
  155.             //
  156.             // Initialize the second HWND in the window words to be the
  157.             // window handle of the spy app.  This will be queried by
  158.             // the hook DLL.
  159.             //
  160.             SetWindowLong(hwnd, sizeof(HWND), (LONG)ghwndSpyApp);
  161.             return 0;
  162.         case WM_DESTROY:
  163.             PostQuitMessage(0);
  164.             return 0;
  165.         case WM_NCDESTROY:
  166.             gfProcessHooks = FALSE;
  167.             break;
  168.     }
  169.     return DefWindowProc(hwnd, msg, wParam, lParam);
  170. }
  171. /*****************************************************************************
  172. * SetSpyHook
  173. *
  174. * Sets the windows hooks used to trap the messages.  After this
  175. * is called with a TRUE for fSet, the messages will start flowing
  176. * through the hook DLL.
  177. *
  178. * Arguments:
  179. *   BOOL fSet - TRUE to hook, FALSE to unhook.
  180. *
  181. * Returns:
  182. *   TRUE if successful.
  183. *
  184. *****************************************************************************/
  185. BOOL
  186. SetSpyHook(
  187.     BOOL fSet
  188.     )
  189. {
  190.     static HHOOK hhkGetMessage = NULL;
  191.     static HHOOK hhkCallWndProc = NULL;
  192.     static HANDLE hmodHook;
  193.     if (fSet)
  194.     {
  195.         if (!hmodHook)
  196.         {
  197.             if (!(hmodHook = LoadLibrary("hook")))
  198.             {
  199.                 Message(MB_OK | MB_ICONEXCLAMATION, 
  200.                         LoadResourceString(IDS_ERROR_CANT_LOAD_DLL));
  201.                 return FALSE;
  202.             }
  203.         }
  204.         if (!hhkGetMessage)
  205.         {
  206.             if (!(hhkGetMessage = SetWindowsHookEx(WH_GETMESSAGE,
  207.                 (HOOKPROC)GetProcAddress(hmodHook, "SpyGetMsgProc"), hmodHook, 0)))
  208.             {
  209.                 return FALSE;
  210.             }
  211.         }
  212.         if (!hhkCallWndProc)
  213.         {
  214.             if (!(hhkCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC,
  215.                 (HOOKPROC)GetProcAddress(hmodHook, "SpyCallWndProc"), hmodHook, 0)))
  216.             {
  217.                 UnhookWindowsHookEx(hhkGetMessage);
  218.                 return FALSE;
  219.             }
  220.         }
  221.     }
  222.     else
  223.     {
  224.         if (hhkGetMessage)
  225.         {
  226.             UnhookWindowsHookEx(hhkGetMessage);
  227.             hhkGetMessage = NULL;
  228.         }
  229.         if (hhkCallWndProc)
  230.         {
  231.             UnhookWindowsHookEx(hhkCallWndProc);
  232.             hhkCallWndProc = NULL;
  233.         }
  234.     }
  235.     return TRUE;
  236. }
  237. /*****************************************************************************
  238. * SetWindowToSpyOn
  239. *
  240. * Sets the current window to spy on to the specified hwnd.  This hwnd can
  241. * also be the special value HWND_ALL to specify that all windows should
  242. * be spy'd upon.
  243. *
  244. * Arguments:
  245. *   HWND hwndSpyingOn - Window handle to spy on, or HWND_ALL for all windows.
  246. *
  247. * Returns:
  248. *   VOID
  249. *****************************************************************************/
  250. VOID
  251. SetWindowToSpyOn(
  252.     HWND hwndSpyingOn
  253.     )
  254. {
  255.     ghwndSpyingOn = hwndSpyingOn;
  256.     gfSpyAll = (ghwndSpyingOn == HWND_ALL) ? TRUE : FALSE;
  257.     SetWindowLong(ghwndSpyHook, 0, (LONG)ghwndSpyingOn);
  258.     SetSpyCaption();
  259. }
  260. #ifdef DBG
  261. /****************************************************************************
  262. * DBGprintf
  263. *
  264. * This debugging function prints out a string to the debug output.
  265. * An optional set of substitutional parameters can be specified,
  266. * and the final output will be the processed result of these combined
  267. * with the format string, just like printf.  A newline is always
  268. * output after every call to this function.
  269. *
  270. * Arguments:
  271. *   LPTSTR fmt - Format string (printf style).
  272. *   ...        - Variable number of arguments.
  273. *
  274. * Returns:
  275. *    VOID
  276. ****************************************************************************/
  277. VOID DbgPrintf(
  278.     LPTSTR fmt,
  279.     ...
  280.     )
  281. {
  282.     va_list marker;
  283.     TCHAR szBuf[256];
  284.     va_start(marker, fmt);
  285.     wvsprintf(szBuf, fmt, marker);
  286.     va_end(marker);
  287.     OutputDebugString(szBuf);
  288.     OutputDebugString(TEXT("rn"));
  289. }
  290. #endif