win32程序测试键盘钩子

  1. // Test_Hook.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4.   
  5. #include "stdafx.h"  
  6. #include <Windows.h>  
  7. #include <stdio.h>  
  8. #include <stdarg.h>  
  9. #include <ctype.h>  
  10. #include <WinError.h>  
  11.   
  12.   
  13. // Some global variables  
  14. HINSTANCE g_Instance;   // Handler of current instance  
  15. HHOOK     g_Hook;       // Handler of hook  
  16.   
  17.   
  18.   
  19.   
  20. BOOL SetHook();  
  21. BOOL UnSetHook();  
  22.   
  23.   
  24. // The hook function (will be called by other processes)  
  25. static LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);  
  26.   
  27.   
  28. //  
  29. //odprintf -- debug function  
  30. void __cdecl odprintf(const char* fmt, ...)  
  31. {  
  32.     char buf[4096], *p = buf;  
  33.     va_list args;  
  34.   
  35.   
  36.     va_start(args, fmt);  
  37.     p += vsnprintf_s(p, sizeof(buf), _TRUNCATE, fmt, args);  
  38.     va_end(args);  
  39.   
  40.   
  41.     while ( p > buf  &&  isspace(p[-1]) )  
  42.         *--p = '\0';  
  43.     *p++ = '\r';  
  44.     *p++ = '\n';  
  45.     *p   = '\0';  
  46.   
  47.   
  48.     OutputDebugStringA(buf);    //output as ANSI string //OutputDebugString  
  49. }  
  50.   
  51.   
  52. LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)  
  53. {  
  54.     KBDLLHOOKSTRUCT* pkh = (KBDLLHOOKSTRUCT*)lParam;  
  55.   
  56.   
  57.     //HC_ACTION: wParam 和lParam参数包含了键盘按键消息  
  58.     if (nCode == HC_ACTION)   
  59.     {  
  60.         if (::GetAsyncKeyState('1') & 0x8000)  
  61.         {  
  62.             odprintf("111111111111111111");  
  63.         }  
  64.         //判断函数调用时指定虚拟键的状态  
  65.         //BOOL bCtrlKey =   ::GetAsyncKeyState(VK_CONTROL) & 0x8000;  
  66.         BOOL bCtrlKey = ::GetAsyncKeyState(VK_CONTROL)>>((sizeof(SHORT) * 8) - 1);  
  67.   
  68.   
  69.   
  70.   
  71.         if ((pkh->vkCode == VK_ESCAPE && bCtrlKey) ||                    // Ctrl+Esc 开始菜单  
  72.             (pkh->vkCode == VK_TAB    && pkh->flags & LLKHF_ALTDOWN) ||       // Alt+TAB 屏幕切换菜单  
  73.             (pkh->vkCode == VK_ESCAPE && pkh->flags & LLKHF_ALTDOWN) ||       // Alt+Esc 屏幕切换   
  74.             (pkh->vkCode == VK_LWIN   || pkh->vkCode==VK_RWIN)                // 左右Windows键  
  75.             )     
  76.         {         
  77.             odprintf("ok...i'am come here!");       //这里会出现两次, 因为  
  78.             return 1;   
  79.         }  
  80.   
  81.   
  82.     }  
  83.   
  84.   
  85.     // Call next hook in chain  
  86.     return ::CallNextHookEx(g_Hook, nCode, wParam, lParam);  
  87. }  
  88.   
  89.   
  90. BOOL SetHook()  
  91. {  
  92.     if (g_Instance || g_Hook)       // Already hooked!  
  93.         return TRUE;  
  94.   
  95.   
  96.     g_Instance = (HINSTANCE)::GetModuleHandle(NULL);  
  97.     g_Hook     = ::SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)KeyboardProc, g_Instance, 0);  
  98.     if (!g_Hook)  
  99.     {  
  100.         odprintf("SetHook error, error code=%ld", ::GetLastError());    //error code  
  101.         return FALSE;  
  102.     }  
  103.   
  104.   
  105.     return TRUE;                                // Hook has been created correctly  
  106. }  
  107.   
  108.   
  109. BOOL UnSetHook()  
  110. {  
  111.     if (g_Hook) {                               // Check if hook handler is valid  
  112.         ::UnhookWindowsHookEx(g_Hook);          // Unhook is done here  
  113.         g_Hook = NULL;                          // Remove hook handler to avoid to use it again  
  114.     }  
  115.   
  116.   
  117.     return TRUE;                                // Hook has been removed  
  118. }  
  119.   
  120.   
  121. int _tmain(int argc, _TCHAR* argv[])  
  122. {  
  123.     odprintf("Test of KeyboardProc, starting...");  
  124.   
  125.   
  126.     if (!SetHook())  
  127.         return -1;  
  128.   
  129.   
  130.     MSG msg;  
  131.     while(::GetMessage(&msg, NULL, 0, 0) > 0)  
  132.     {  
  133.         TranslateMessage(&msg);  
  134.         DispatchMessage(&msg);  
  135.     }  
  136.   
  137.   
  138.     //clean:  
  139.     UnSetHook();  
  140.   
  141.   
  142.     return 0;  
  143. }  
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值