本文出自程序人生 >> 使用低级键盘钩子实现键盘改键
使用低级键盘钩子实现键盘改键
很垃圾的文章了,大牛们直接飘过吧。
为什么要实现改键?
前几天玩一个游戏,因为ASDW这几个键不能控制方向所以感觉很不方便,于是就想出了自己写一个全局键盘钩子来实现改键的程序;一般能自己解决的问题我都会自己想办法解决,所以也没有用网上先有的程序了。
怎么实现键盘改键?
装一个全局的低级键盘钩子(WH_KEYBOARD_LL),在键盘钩子回调函数(LowLevelKeyboardProc)中判断是不是目标按键,如果是则通过keybd_event来实现模拟按键,同时直接用return TRUE;来对回调函数进行返回。如果不是目标按键,那么需要传递到下一个钩子链。全局的钩子需要放在DLL里面。
改键效果
对普通程序有效……因为我玩的游戏是Direct X的,所以键盘钩子完全相当于不存在,因为没有接触过Direct X,所以就没有继续写下去了。
改键代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| // 说明:头文件KeyRedir.h
// 作者:代码疯子
// Blog: http://www.programlife.net/
#ifndef __KEYHOOK_H_H
#define __KEYHOOK_H_H
#ifdef MY_HOOK_API
#else
#define MY_HOOK_API _declspec(dllimport)
#endif
#ifdef __cplusplus
extern "C" {
#endif
MY_HOOK_API BOOL __stdcall InstallHook();
MY_HOOK_API BOOL __stdcall UnInstallHook();
#ifdef __cplusplus
}
#endif
#endif |
1
2
3
4
5
6
7
8
| // 说明:Def文件KeyRedir.def
// 作者:代码疯子
// Blog: http://www.programlife.net/
LIBRARY "KeyRedir"
EXPORTS
InstallHook
UnInstallHook |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| // 说明:源文件KeyRedir.cpp
// 作者:代码疯子
// Blog: http://www.programlife.net/
#include <windows.h>
#pragma warning(disable:4996)
#define MY_HOOK_API _declspec(dllexport)
#include "KeyRedir.h"
HINSTANCE g_hInst = NULL;
static HHOOK g_hHook = NULL;
BYTE g_bVK[4] = {VK_LEFT, VK_DOWN, VK_RIGHT, VK_UP};
LRESULT CALLBACK LowLevelKeyboardProc(
int code,
WPARAM wParam,
LPARAM lParam)
{
if(code == HC_ACTION)
{
PKBDLLHOOKSTRUCT pStruct = (PKBDLLHOOKSTRUCT)lParam;
DWORD dwIndex = 0;
switch (pStruct->vkCode)
{
case L'A':
case L'a':
dwIndex = 0;
break;
case L'S':
case L's':
dwIndex = 1;
break;
case L'D':
case L'd':
dwIndex = 2;
break;
case L'W':
case L'w':
dwIndex = 3;
break;
default:
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
if (wParam == WM_KEYDOWN)
{
keybd_event(g_bVK[dwIndex], MapVirtualKey(g_bVK[dwIndex], 0), 0, 0);
}
else if (wParam == WM_KEYUP)
{
keybd_event(g_bVK[dwIndex], MapVirtualKey(g_bVK[dwIndex], 0), KEYEVENTF_KEYUP, 0);
}
return TRUE;
}
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
BOOL __stdcall InstallHook()
{
g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
LowLevelKeyboardProc,
g_hInst,
NULL);
return g_hHook == NULL ? FALSE : TRUE;
}
BOOL __stdcall UnInstallHook()
{
return UnhookWindowsHookEx(g_hHook);
}
BOOL WINAPI DllMain(IN HINSTANCE hDllHandle,
IN DWORD nReason,
IN LPVOID Reserved)
{
g_hInst = hDllHandle;
return TRUE;
} |
原创文章,转载请注明:
本文出自程序人生 >> 使用低级键盘钩子实现键盘改键
作者:代码疯子
您可能对下面的文章也感兴趣:
- 在DLL中获取主进程窗口句柄 (16.3)
- Win32写的屏幕取色工具 (15.5)
- SysListView32控件响应鼠标单击消息 (15.4)
- SDK设置编辑框控件只读属性 (12.8)
- error C2059: syntax error : ‘string’ (11.6)