详细步骤
例行说明
- 有了各个键值
vkCode
,就可以做按钮绑定了
上个版本V1.2.2
还不是严格意义上的写代码,从V1.0
到现在一行代码都没写,手都开始痒起来了。。。
具体步骤
-
首先需要用到两个
jar
包,按照以下链接下载并导入,img1
链接:https://pan.baidu.com/s/1n7kIidocxo0tAGoob9ygRg 提取码:4b7t -
新建一个
Thread
类 KeyboardHook (V1.3
版代码)专门做键盘监听及其处理(项目开发的模块化思维)
hook
就是钩子的意思,熟悉 C++ 的童鞋应该有用过LowLevelKeyboardProc
其实是 Windows API,只不过java
对其封装以便在java
环境下调用,而上述的两个外包就是别人封装好的 API,直接用就行了callback()
回调函数,对键盘监听,用户可以对系统传递的按键信息拦截处理run()
启动线程,同时启动键盘事件监听
-
img1
代码分析
run()
线程启动- 初始化 钩子模型
HMODULE
- 设置钩子
HHook
MSG
用于存储键盘消息GetMessage()
是阻塞方法
根据后期的测试,博主认为该方法/函数会调用callback()
(回调),之所以是回调,是因为callback()
内部又调用自身 / 执行CallNextHookEx
操作,以此形成循环(递推),达到不断对键盘事件监听的效果(具体情况如何,有待验证)
- 初始化 钩子模型
注: 博主这里的
GetMessage()
操作不规范,规范操作见文末 相关链接
@Override
public void run() {
HMODULE hMod = Kernel32.INSTANCE.GetModuleHandle(null);
hhk = User32.INSTANCE.SetWindowsHookEx(User32.WH_KEYBOARD_LL, keyboardProc, hMod, 0);
WinUser.MSG msg = new WinUser.MSG();
while ((User32.INSTANCE.GetMessage(msg, null, 0, 0)) != 0) { }
}
callback()
回调函数LowLevelKeyboardProc
低级钩子函数,实现键盘监听- 参数介绍
callback()
会在线程起来后自动调用,参数也是系统给的code
判断按键是否有效WPARAM
用于监听键的 按下 & 抬起KBDLLHOOKSTRUCT
键的结构,JSON 格式,里面的参数记录键的信息
vkCode
键的标识码(其他信息后期都会用到,用到再介绍)
- 代码的逻辑分析
如果按键有效,则执行下列操作,否则放弃治疗,直接监听下一个键盘事件CallNextHookEx
- 通过
event
拿到vkCode
switchKey()
用户对拦截的按键消息进行处理- 返回结果,这里参数为 1,意义是屏蔽按键
- 通过
private class KeyboardProc implements LowLevelKeyboardProc {
private int key = 0;
@Override
public LRESULT callback(int code, WPARAM wParam, KBDLLHOOKSTRUCT event) {
if(code >= 0) {
key = event.vkCode;
switchKey(key);
return new LRESULT(1); //KIA all keys
}
return User32.INSTANCE.CallNextHookEx(hhk, code, wParam, null);
}
}
到这里就把键盘监听的框架搭好了,下个版本对
switchKey()
做相应处理
相关链接
-
LowLevelKeyboardProc 详解(C++) 注:该博文排版有点乱,不过都是干货,值得一看