很垃圾的文章了,大牛们直接飘过吧。
为什么要实现改键?
前几天玩一个游戏,因为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 }