您的位置:首页 > 其它

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

2011-11-10 14:58 519 查看
本文出自程序人生 >> 使用低级键盘钩子实现键盘改键

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

很垃圾的文章了,大牛们直接飘过吧。

为什么要实现改键?
前几天玩一个游戏,因为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
2324
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)

分类:Windows SDK标签:HOOK, 改键, 键盘钩子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: