LoveBeyond

使用低级键盘钩子实现键盘改键

很垃圾的文章了,大牛们直接飘过吧。
为什么要实现改键?
前几天玩一个游戏,因为ASDW这几个键不能控制方向所以感觉很不方便,于是就想出了自己写一个全局键盘钩子来实现改键的程序;一般能自己解决的问题我都会自己想办法解决,所以也没有用网上先有的程序了。
怎么实现键盘改键?
装一个全局的低级键盘钩子(WH_KEYBOARD_LL),在键盘钩子回调函数(LowLevelKeyboardProc)中判断是不是目标按键,如果是则通过keybd_event来实现模拟按键,同时直接用return TRUE;来对回调函数进行返回。如果不是目标按键,那么需要传递到下一个钩子链。全局的钩子需要放在DLL里面。
改键效果
对普通程序有效……因为我玩的游戏是Direct X的,所以键盘钩子完全相当于不存在,因为没有接触过Direct X,所以就没有继续写下去了。
改键代码
 1 // 说明:头文件KeyRedir.h
 2 // 作者:代码疯子
 3 // Blog: http://www.programlife.net/
 4 #ifndef __KEYHOOK_H_H
 5 #define __KEYHOOK_H_H
 6  
 7 #ifdef MY_HOOK_API
 8 #else
 9 #define MY_HOOK_API _declspec(dllimport)
10 #endif
11  
12 #ifdef __cplusplus
13 extern "C" {
14 #endif 
15  
16     MY_HOOK_API BOOL __stdcall InstallHook();
17     MY_HOOK_API BOOL __stdcall UnInstallHook();
18  
19 #ifdef __cplusplus
20 }
21 #endif 
22  
23 #endif

1 // 说明:Def文件KeyRedir.def
2 // 作者:代码疯子
3 // Blog: http://www.programlife.net/
4 LIBRARY    "KeyRedir"
5  
6 EXPORTS
7 InstallHook
8 UnInstallHook

 1 // 说明:源文件KeyRedir.cpp
 2 // 作者:代码疯子
 3 // Blog: http://www.programlife.net/
 4 #include <windows.h>
 5  
 6 #pragma warning(disable:4996)
 7  
 8 #define MY_HOOK_API _declspec(dllexport)
 9 #include "KeyRedir.h"
10  
11 HINSTANCE g_hInst = NULL;
12 static HHOOK g_hHook = NULL;
13  
14 BYTE g_bVK[4] = {VK_LEFT, VK_DOWN, VK_RIGHT, VK_UP};
15  
16 LRESULT CALLBACK LowLevelKeyboardProc(
17     int code,
18     WPARAM wParam,
19     LPARAM lParam)
20 {
21     if(code == HC_ACTION)
22     {
23         PKBDLLHOOKSTRUCT pStruct = (PKBDLLHOOKSTRUCT)lParam;
24         DWORD dwIndex = 0;
25         switch (pStruct->vkCode)
26         {
27         case L'A':
28         case L'a':
29             dwIndex = 0;
30             break;
31  
32         case L'S':
33         case L's':
34             dwIndex = 1;
35             break;
36  
37         case L'D':
38         case L'd':
39             dwIndex = 2;
40             break;
41  
42         case L'W':
43         case L'w':
44             dwIndex = 3;
45             break;
46  
47         default:
48             return CallNextHookEx(g_hHook, code, wParam, lParam);
49         }
50         if (wParam == WM_KEYDOWN)
51         {
52             keybd_event(g_bVK[dwIndex], MapVirtualKey(g_bVK[dwIndex], 0), 0, 0);                                
53         }
54         else if (wParam == WM_KEYUP)
55         {
56             keybd_event(g_bVK[dwIndex], MapVirtualKey(g_bVK[dwIndex], 0), KEYEVENTF_KEYUP, 0);
57         }
58         return TRUE;
59     }
60     return CallNextHookEx(g_hHook, code, wParam, lParam);
61 }
62  
63 BOOL __stdcall InstallHook()
64 {
65     g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
66         LowLevelKeyboardProc,
67         g_hInst,
68         NULL);
69     return g_hHook == NULL ? FALSE : TRUE;
70 }
71  
72 BOOL __stdcall UnInstallHook()
73 {
74     return UnhookWindowsHookEx(g_hHook);
75 }
76  
77 BOOL WINAPI DllMain(IN HINSTANCE hDllHandle,
78                     IN DWORD nReason,
79                     IN LPVOID Reserved)
80 {
81     g_hInst = hDllHandle;
82     return TRUE;
83 }

原创文章,转载请注明:
本文出自程序人生 >> 使用低级键盘钩子实现键盘改键
作者:代码疯子

您可能对下面的文章也感兴趣:
  1. 在DLL中获取主进程窗口句柄 (16.3)
  2. Win32写的屏幕取色工具 (15.5)
  3. SysListView32控件响应鼠标单击消息 (15.4)
  4. SDK设置编辑框控件只读属性 (12.8)
  5. error C2059: syntax error : ‘string’ (11.6)
分类:Windows SDK标签:

posted on 2011-11-10 15:03 LoveBeyond 阅读(3509) 评论(0)  编辑 收藏 引用

<2011年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

导航

统计

留言簿(1)

文章分类

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

友情链接:C++博客 LoveBeyond 代码疯子 程序人生 C++技术博客