很垃圾的文章了,大牛們直接飄過(guò)吧。
為什么要實(shí)現(xiàn)改鍵?
前幾天玩一個(gè)游戲,因?yàn)锳SDW這幾個(gè)鍵不能控制方向所以感覺(jué)很不方便,于是就想出了自己寫(xiě)一個(gè)全局鍵盤(pán)鉤子來(lái)實(shí)現(xiàn)改鍵的程序;一般能自己解決的問(wèn)題我都會(huì)自己想辦法解決,所以也沒(méi)有用網(wǎng)上先有的程序了。
怎么實(shí)現(xiàn)鍵盤(pán)改鍵?
裝一個(gè)全局的低級(jí)鍵盤(pán)鉤子(WH_KEYBOARD_LL),在鍵盤(pán)鉤子回調(diào)函數(shù)(LowLevelKeyboardProc)中判斷是不是目標(biāo)按鍵,如果是則通過(guò)keybd_event來(lái)實(shí)現(xiàn)模擬按鍵,同時(shí)直接用return TRUE;來(lái)對(duì)回調(diào)函數(shù)進(jìn)行返回。如果不是目標(biāo)按鍵,那么需要傳遞到下一個(gè)鉤子鏈。全局的鉤子需要放在DLL里面。
改鍵效果
對(duì)普通程序有效……因?yàn)槲彝娴挠螒蚴荄irect X的,所以鍵盤(pán)鉤子完全相當(dāng)于不存在,因?yàn)闆](méi)有接觸過(guò)Direct X,所以就沒(méi)有繼續(xù)寫(xiě)下去了。
改鍵代碼
1 // 說(shuō)明:頭文件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 // 說(shuō)明:Def文件KeyRedir.def
2 // 作者:代碼瘋子
3 // Blog: http://www.programlife.net/
4 LIBRARY "KeyRedir"
5
6 EXPORTS
7 InstallHook
8 UnInstallHook
1 // 說(shuō)明:源文件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 }