淺談鍵盤掃描碼
大约 3 分鐘
鍵盤掃描碼
前言
本文主要探討 keybd_event
函式,
坊間許多的按鍵精靈都會有相關的範例。
由於 keybd_event
比起其他 SendMessage
、PostMessage
等函式更為底層,
所以在撰寫上都比較推薦用 keybd_event
來做鍵盤訊號的模擬。
鍵盤虛擬碼與鍵盤掃描碼
當參考官方文件 keybd_event函式 (winuser.h) 時會看到語法如下
void keybd_event(
[in] BYTE bVk,
[in] BYTE bScan,
[in] DWORD dwFlags,
[in] ULONG_PTR dwExtraInfo
);
bVk 是鍵盤虛擬碼
bScan 是鍵盤掃描碼
dwFlags 控制函式作業的各種層面。 此參數可以是下列一或多個值。
值 | 意義 |
---|---|
KEYEVENTF_EXTENDEDKEY 0x0001 | 如果指定,掃描碼前面會加上前置詞位元組。 |
KEYEVENTF_KEYUP 0x0002 | 如果指定,則會釋放掃描碼訊號。如果未指定,按鍵持續按下。 |
一般的按鍵腳本通常用鍵盤虛擬碼就可以起作用
所以許多網路上的教學都使用 System.Windows.Forms
的 Keys
列舉傳入 bVk
然後 bScan
都直接說傳入 0 即可。
事實上也不能說是錯的,因為許多電腦應用程式是可以生效的,
但對於一些遊戲,如果沒有傳入掃描碼不會有作用,
原因是有些遊戲接收的訊號是硬體訊號,
特別是跨平台或以家機為主開發的遊戲。
鍵盤掃描碼與鍵盤驅動的關係
那麼為什麼要這麼麻煩分成兩個呢?
由於歷史因素,各家生產的鍵盤的硬體訊號會有不同,
像是以前的鍵盤是 PS/2 規格的。
但作業系統不可能知道所有鍵盤的訊號,
所以需要鍵盤驅動來做轉換,
順序大致如下:
- 使用者按下鍵盤的某個按鍵
- 鍵盤控制器發送硬體訊號到作業系統,這裡的硬體訊號就是掃描碼
- 掃描碼輸入到作業系統
- 作業系統接收到掃描碼
- 作業系統轉發掃描碼到鍵盤驅動
- 鍵盤驅動轉換為鍵盤虛擬碼
鍵盤掃描碼怎麼查
還好經歷時代洪流,那些神奇規格的鍵盤都死得差不多了。
目前主流電腦鍵盤按鍵沿用 IBM 的行列矩陣方式佈局排列,稱為掃描矩陣。
可以用 掃描碼對照表 來參考。
結論
坊間的網路教學都說 bScan
都傳入 0 即可。
但知道了掃描碼的由來與作用,
這邊還是建議撰寫時可以傳入對應的數值。