KeyboardPianoV1.3.1 按鈕綁定(調用)


詳細步驟

例行說明

  • 上一個版本已經把鍵盤監聽的框架搭好了,就差調用綁定

具體步驟

  • 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
    img1

項目又朝着完整度的方向邁了一步 ^ ^


BUG 記錄

  • 按鍵衝突 BUG(衝突區域見 img2
    1. NumLock 對數字鍵盤的開啓 & 關閉,數字鍵區的按鈕失靈
    2. Alt 按鍵後導致有些按鍵無法按下/擡起
    3. 由於鉤子函數攔截了按鍵信息並屏蔽了系統按鍵導致程序不退出,系統無法正常按鍵

這裏之所以沒有對 BUG 進行詳細描述,除了之前擼代碼的時候沒去注意到,同時也是因爲這些 BUGs 的糾正是在很後的版本處理的,再加上 BUG 不影響後續開發,所以這裏做了模糊處理

  • img2
    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 & NumpadEntervkCode 相同,但 flags 不同,以此作爲區分的關鍵

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章