详细步骤
例行说明
- 上一个版本已经把键盘监听的框架搭好了,就差调用绑定了
具体步骤
callback()
=>switchKey()
=>select()
没了
代码分析
callback()
监听键盘事件,把vkCode
&wparam
传递给switchKey()
进行按钮绑定以及控制
@Override
public LRESULT callback(int code, WPARAM wParam, KBDLLHOOKSTRUCT event) {
if(code >= 0) {
int key = event.vkCode;
int type = Integer.parseInt(wParam.toString());
switchKey(key, type);
return new LRESULT(1); //KIA all keys
}
return User32.INSTANCE.CallNextHookEx(hhk, code, wParam, null);
}
switchKey()
通过不同的key
定位不同的按钮,并对不同的按钮进行select
处理 (Press & Release)
public void select(JToggleButton jtb, int type) {
if(type == KeyboardPiano.BUTTON_UP) {
jtb.setSelected(false);
} else if(type == KeyboardPiano.BUTTON_DOWN) {
jtb.setSelected(true);
}
}
-
整体处理细节,请见 V1.3.1 KeyboardHook.java
-
按钮绑定示意图(博主一手把键盘中部的键全按下了,img1 显示的是绑定后的结果)
-
img1
项目又朝着完整度的方向迈了一步 ^ ^
BUG 记录
- 按键冲突 BUG(冲突区域见 img2)
- NumLock 对数字键盘的开启 & 关闭,数字键区的按钮失灵
- Alt 按键后导致有些按键无法按下/抬起
- 由于钩子函数拦截了按键信息并屏蔽了系统按键,导致程序不退出,系统无法正常按键
这里之所以没有对 BUG 进行详细描述,除了之前撸代码的时候没去注意到,同时也是因为这些 BUGs 的纠正是在很后的版本处理的,再加上 BUG 不影响后续开发,所以这里做了模糊处理
- img2
Options
Option1
-
以 Shift_Left 为例
两种键按下的wparam-flags
,与之对应两种键抬起的wparam-flags
(其他按键相似,但略有不同)vkCode = 160 Pressed1 Pressed2 Released1 Released2 wparam 256 260 257 261 flags 0 32 128 160
再次强调,
wparam
标识键的 Pressed & Released
flags
则是对vkCode
相同的情况下进一步的分类
如 Enter & NumpadEnter 的vkCode
相同,但flags
不同,以此作为区分的关键