跳至主要內容

淺談鍵盤掃描碼

Pamis Wang大约 3 分鐘外掛開發外掛按鍵精靈鍵盤腳本

鍵盤掃描碼

前言

本文主要探討 keybd_event 函式,
坊間許多的按鍵精靈都會有相關的範例。
由於 keybd_event 比起其他 SendMessagePostMessage 等函式更為底層,
所以在撰寫上都比較推薦用 keybd_event 來做鍵盤訊號的模擬。

鍵盤虛擬碼與鍵盤掃描碼

當參考官方文件 keybd_event函式 (winuser.h)open in new window 時會看到語法如下

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.FormsKeys 列舉傳入 bVk
然後 bScan 都直接說傳入 0 即可。

事實上也不能說是錯的,因為許多電腦應用程式是可以生效的,
但對於一些遊戲,如果沒有傳入掃描碼不會有作用,
原因是有些遊戲接收的訊號是硬體訊號,
特別是跨平台或以家機為主開發的遊戲。

鍵盤掃描碼與鍵盤驅動的關係

那麼為什麼要這麼麻煩分成兩個呢?

由於歷史因素,各家生產的鍵盤的硬體訊號會有不同,
像是以前的鍵盤是 PS/2 規格的。
現在看過的都是老人了

但作業系統不可能知道所有鍵盤的訊號,
所以需要鍵盤驅動來做轉換,
順序大致如下:

  1. 使用者按下鍵盤的某個按鍵
  2. 鍵盤控制器發送硬體訊號到作業系統,這裡的硬體訊號就是掃描碼
  3. 掃描碼輸入到作業系統
  4. 作業系統接收到掃描碼
  5. 作業系統轉發掃描碼到鍵盤驅動
  6. 鍵盤驅動轉換為鍵盤虛擬碼

鍵盤掃描碼怎麼查

還好經歷時代洪流,那些神奇規格的鍵盤都死得差不多了。

目前主流電腦鍵盤按鍵沿用 IBM 的行列矩陣方式佈局排列,稱為掃描矩陣。
可以用 掃描碼對照表open in new window 來參考。

結論

坊間的網路教學都說 bScan 都傳入 0 即可。
但知道了掃描碼的由來與作用,
這邊還是建議撰寫時可以傳入對應的數值。

參考資料

keybd_event 函式 (winuser.h)open in new window
虛擬按鍵代碼open in new window
鍵盤輸入概觀open in new window
电脑键盘工作原理open in new window
PS/2 Keyboardopen in new window

上次編輯於:
貢獻者: Pamis Wang