首页 > Windows SDK > 使用低级键盘钩子实现键盘改键

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

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

觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 使用低级键盘钩子实现键盘改键
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: Windows SDK 标签: , ,
  1. 2011年10月24日22:06 | #1

    嗯,来捧个场先 [em020]

    [回复]

    代码疯子 回复:

    @代码部落(Winson), 呵呵

    [回复]

  2. 2011年10月25日17:35 | #2

    绝对的技术流博客!

    [回复]

    代码疯子 回复:

    @cnbloge, [em022]

    [回复]

  3. 2011年10月25日22:18 | #3

    为了玩游戏改代码, [em022]

    [回复]

  4. 2011年10月26日10:04 | #4

    不错,看懂了 [em022]

    [回复]

    代码疯子 回复:

    @youstar, [em020]

    [回复]

  5. 2011年10月26日18:55 | #5

    只能光看了···看着像c 是c吗?

    [回复]

  6. 2012年1月6日13:53 | #6

    想问个问题,如果我要把A改成 W+D组合键要怎么修改上面的程序 [em011] 。。~~

    [回复]

    代码疯子 回复:

    @小止, 把A的KEYDOWN和KEYUP替换为W和D同时KEY_DOWN和KEY_UP就是了

    [回复]

  7. 2012年1月6日18:45 | #7

    嗯的啊 我试试

    [回复]

    代码疯子 回复:

    @小止, 具体自己改代码吧。

    [回复]

  8. NewbieCoder
    2012年8月24日00:28 | #8

    对普通程序有效……因为我玩的游戏是Direct X的,所以键盘钩子完全相当于不存在,因为没有接触过Direct X,所以就没有继续写下去了。

    其实很多war3改键就是用WH_KEYBOARD_LL搞的~~

    [回复]

  9. goodhearts
    2014年7月7日23:12 | #9

    我发现传播知识还是很有意义的,博主自己发过的帖子可能几年过去自己都完全不记得了,甚至可能连网站都不更新了,却还可以在网上发光发热,为初学者带来帮助.博主创造过的一切,并没有随着时间消退,这是一种默默生长的状态,大声希音,无远弗届.

    [回复]