設定鍵盤和滑鼠類別驅動程式
非 HID 鍵盤和滑鼠可以透過多個舊版總線連線,但仍使用相同的類別驅動程式。 本節包含類別驅動程式本身的詳細數據。 下列各節將深入探討控制器的詳細數據。
本主題描述 Microsoft Windows 2000 和更新版本中鍵盤和滑鼠裝置的典型實體設定。
下圖顯示採用單一鍵盤和單一滑鼠的兩個常見設定。
左側的圖顯示鍵盤,以及透過獨立控制器連接到系統總線的滑鼠。 一般設定是由透過 i8042 控制器操作的 PS/2 樣式鍵盤,以及透過序列埠控制器操作的序列樣式滑鼠所組成。
下列其他資訊對於鍵盤和滑鼠製造商而言很重要:
- 基於安全性考慮,操作系統堆疊會以獨佔模式開啟鍵盤
- Windows 支援多個鍵盤和滑鼠裝置的同時連線。
- Windows 不支援用戶端對每個裝置的獨立存取。
類別驅動程式功能
本主題描述下列 Microsoft Windows 2000 和更新版本系統類別驅動程式的功能:
Kbdclass,GUID_CLASS_KEYBOARD裝置類別的裝置類別驅動程式
GUID_CLASS_MOUSE裝置類別的類別驅動程式
Kbdclass 會實作 Kbdclass 服務,而且其可執行映射 kbdclass.sys。
此為 mouclass.sys,而其可執行映像會實作一個 mouclass.sys。
Kbdclass 和,每個功能都包含:
裝置類別的泛型和硬體獨立作業。
隨插即用、電源管理和 Windows Management Instrumentation (WMI) 。
舊版裝置的作業。
同時操作多個裝置。
函式驅動程式用來將數據從裝置的輸入數據緩衝區傳輸到類別驅動程式的數據緩衝區的 類別服務回呼例程 連接。
裝置物件的設定
下圖顯示 隨插即用 PS/2 樣式鍵盤和滑鼠裝置的裝置物件設定。 每個類別驅動程式都會 (篩選 DO) 建立上層類別 篩選設備物件 , (FDO) 透過選擇性的上層裝置篩選器 DO 附加至函式裝置物件。 上層裝置篩選驅動程式會建立高層級裝置篩選器 DO。 I8042prt 會建立函式 DO,並將其連結至根總線驅動程式所建立的 PDO) 實體裝置物件 (。
PS/2 鍵盤
鍵盤驅動程式堆疊包含下列各項。
- Kbdclass,上層鍵盤類別篩選驅動程式
- 一或多個選用的上層鍵盤篩選驅動程式
- I8042prt,函式驅動程式
PS/2 滑鼠
滑鼠驅動程式堆疊包含下列各項。
- 一層滑鼠類別篩選驅動程式,上層滑鼠類別篩選驅動程式
- 一或多個選擇性的上層滑鼠篩選驅動程式
- I8042prt,函式驅動程式
Kbdclass 和 一個以上的裝置 可以在兩種不同的模式中支援多個裝置。 在 一對一模式中,每個裝置都有獨立的裝置堆疊。 類別驅動程式會建立獨立類別 DO,並將其連結至每個裝置堆疊。 每個裝置堆疊都有自己的控制狀態和輸入緩衝區。 Microsoft Win32 子系統會透過唯一的檔案物件,從每個裝置存取輸入。
在 總計模式中,類別驅動程式會以下列方式操作所有裝置:
類別驅動程式會建立 代表 每個裝置的所有裝置和 次級類別 DO 的總計類別 DO 。
類別驅動程式會將從屬類別 DO 連結至每個裝置堆疊。 在次級類別 DO 下方,裝置堆疊與在一對一模式中建立的裝置堆疊相同。
Grandmaster 類別 DO 會控制所有次級 DO 的作業。
Win32 子系統會透過代表 Grandmaster 類別裝置的檔案物件存取所有裝置輸入。
所有裝置輸入都會緩衝處理在總計的數據佇列中。
Grandmaster 會維護單一全域裝置狀態。
如果 Kbdclass 和一對一模式的登錄專案值 ConnectMultiplePorts 設定為0x00 (位於 HKLM\Services\CurrentControlSet\class service>\<Parameters 底下,其中類別服務是 Kbdclass 或) 。 否則,Kbdclass 和則以 Master 模式運作。
透過類別驅動程式開啟並關閉
Microsoft Win32 子系統會開啟所有鍵盤和滑鼠裝置以供獨佔使用。 針對每個裝置類別,Win32 子系統會將來自所有裝置的輸入視為輸入來自單一輸入設備。 應用程式無法要求只接收來自一個特定裝置的輸入。
Win32 子系統會在收到啟用GUID_CLASS_KEYBOARD或GUID_CLASS_MOUSE裝置介面 隨插即用 管理員的通知之後,動態開啟 隨插即用 輸入設備。 Win32 子系統在收到已開啟介面已停用的通知之後,關閉 隨插即用 裝置。 Win32 子系統也會依名稱 (開啟舊版裝置,例如 “\Device\KeyboardLegacyClass0”) 。 請注意,一旦 Win32 子系統成功開啟舊版裝置,就無法判斷裝置稍後是否已實際移除。
在 Kbdclass 和一般系統收到建立要求之後,他們會針對 隨插即用 和舊版作業執行下列動作:
隨插即用 作業
如果裝置處於 隨插即用 啟動狀態,類別驅動程式會將IRP_MJ_CREATE要求向下傳送至驅動程式堆疊。 否則,類別驅動程式會完成要求,而不需將要求向下傳送至驅動程式堆疊。 類別驅動程式會設定可讀取裝置的受信任檔案。 如果有總計裝置,類別驅動程式會將建立要求傳送至與次級類別裝置相關聯的所有埠。
舊版作業
類別驅動程式會將內部裝置控制要求傳送至埠驅動程式,以啟用裝置。
將服務回呼連線到裝置
類別驅動程式必須先將其類別服務連線到裝置,才能開啟裝置。 類別驅動程式在將類別 DO 附加至裝置堆疊之後,會連接其類別服務。 函式驅動程式會使用類別服務回呼,將輸入資料從裝置傳輸到裝置的類別數據佇列。 裝置的函式驅動程式 ISR 分派完成例程會呼叫類別服務回呼。 Kbdclass 提供類別服務回呼 KeyboardClassServiceCallback,而一個類別類別則提供類別服務回呼 MouseClassServiceCallback。
廠商可以藉由安裝裝置的上層篩選驅動程式來修改類別服務回呼的作業。 範例鍵盤篩選驅動程式 Kbfiltr 會定義KbFilter_ServiceCallback回呼,而範例滑鼠篩選驅動程式的MouFilter_ServiceCallback回呼。 範例篩選服務回呼可以設定為修改從裝置的埠輸入緩衝區傳輸到類別數據佇列的輸入數據。 例如,篩選服務回呼可以刪除、轉換或插入數據。
類別和篩選服務回呼會以下列方式連線:
類別驅動程式會在裝置堆疊下傳送內部裝置連線要求 , (IOCTL_INTERNAL_KEYBOARD_CONNECT 或 IOCTL_INTERNAL_MOUSE_CONNECT) 。 類別連接數據是由包含類別裝置物件指標的CONNECT_DATA結構所指定,以及類別服務回呼的指標。
篩選驅動程式收到連接要求之後,它會儲存類別連接數據的複本,並將要求的連線數據取代為篩選連接數據。 篩選連接數據會指定篩選裝置物件的指標,以及篩選驅動程式服務回呼的指標。 篩選驅動程序接著會將篩選的連線要求傳送至函式驅動程式。
類別和篩選服務回呼會以下列方式呼叫:
函式驅動程式會使用篩選連接數據,對篩選服務回呼進行初始回呼。
篩選輸入數據之後,篩選服務回呼會使用類別連接儲存的數據,以回呼類別服務回呼。
查詢並設定鍵盤裝置
I8042prt 支援下列內部裝置控制要求,以查詢鍵盤裝置的相關信息,以及在鍵盤裝置上設定參數:
IOCTL_KEYBOARD_QUERY_ATTRIBUTES
IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION
IOCTL_KEYBOARD_QUERY_INDICATORS
IOCTL_KEYBOARD_QUERY_TYPEMATIC
如需所有鍵盤設備控制要求的詳細資訊,請參閱 Human Interface Devices Reference。
掃描鍵盤的代碼對應程式
在 Microsoft Windows 作業系統中,輸入設備所提供的 PS/2 相容掃描代碼會轉換成虛擬密鑰,以 Windows 訊息的形式透過系統傳播。 如果裝置針對特定金鑰產生不正確的掃描碼,則會傳送錯誤的虛擬密鑰訊息。 這可藉由撰寫篩選驅動程式來分析韌體所產生的掃描碼,並將不正確的掃描程式代碼修改為系統所瞭解的掃描碼來修正。 不過,這是繁瑣的程式,如果核心層級篩選驅動程式中有錯誤,有時可能會導致嚴重問題。
Windows 2000 和 Windows XP 包含新的掃描代碼對應程式,其提供一種方法來允許對應掃描碼。 Windows 的掃描程式代碼對應會儲存在下列登入機碼中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout
注意 另外還有 鍵盤版 面配置按鍵 (請注意控件鍵底下的複數形式) ,但不應修改該按鍵。
在 [鍵盤配置 ] 鍵中,必須新增 Scancode Map 值。 這個值的類型REG_BINARY (小的 Endian 格式) ,且下表指定了數據格式。
以位元組為單位的開始位移 () | 大小 (以位元組為單位) | 資料 |
---|---|---|
0 | 4 | 標頭:版本資訊 |
4 | 4 | 標頭:旗標 |
8 | 4 | 標頭:對應數目 |
12 | 4 | 個別對應 |
... | ... | ... |
最後 4 個字節 | 4 | Null 終止符 (0x00000000) |
第一個和第二個 DWORDS 會儲存標頭資訊,而且應該設定為目前掃描程式代碼對應程式的所有零。 第三個 DWORD 專案會保留下列對應總數的計數,包括 Null 終止對應。 因此,最小計數會是 1 (沒有指定) 的對應。 個別對應會遵循標頭。 每個對應都是長度為一個 DWORD,並分成兩個 WORD 長度欄位。 每個 WORD 欄位都會儲存要對應的索引鍵掃描碼。
一旦對應儲存在登錄中,系統必須重新啟動,對應才會生效。 請注意,如果在按鍵按鍵上需要掃描程式代碼的對應,則步驟會在掃描程式代碼轉換成虛擬密鑰之前,在使用者模式中執行。 在使用者模式中執行這項轉換可能會有某些限制,例如在終端機服務下執行時,對應無法正常運作。
若要移除這些對應,請移除 Scancode Map 登錄值並重新啟動。
範例 1
以下提供範例。 若要將左 CTRL 鍵與 CAPS LOCK 機碼交換,請使用登錄編輯器 (最好 Regedt32.exe) 以下列值修改 Scancode Map 機碼:
00000000 00000000 03000000 3A001D00 1D003A00 00000000
下表包含分割成 DWORD 欄位的這些專案,以及交換的位元組。
值:解譯
0x00000000:標頭:版本。 設定為所有零。
0x00000000:標頭:旗標。 設定為所有零。
0x00000003:地圖中的三個專案 (包括 null 專案) 。
0x001D003A:左 CTRL 鍵 --> CAPS LOCK (0x1D --> 0x3A) 。
0x003A001D:CAPS LOCK --> 左 CTRL 鍵 (0x3A --> 0x1D) 。
0x00000000:Null 終止符。
範例 2
您也可以新增鍵盤上未正式運作的按鍵,或移除從未使用過的按鍵。 下列範例顯示儲存在 Scancode Map 中的值,以移除右 CTRL 鍵,並變更右 ALT 鍵的功能,以作為靜音鍵運作:
00000000 00000000 03000000 00001DE0 20E038E0 00000000
下表包含分割成 DWORD 欄位的這些專案,以及交換的位元組。
值:解譯
0x00000000:標頭:版本。 設定為所有零。
0x00000000:標頭:旗標。 設定為所有零。
0x00000003:地圖中的三個專案 (包括 null 專案) 。
0xE01D0000:移除右 CTRL 鍵 (0xE01D --> 0x00) 。
0xE038E020:右 ALT 鍵 --> 將按鍵設為靜音 (0xE038 --> 0xE020) 。
0x00000000:Null 終止符。
產生必要的數據之後,可以透過數種方式將它插入登錄中。
- 您可以產生 .reg 檔案,使用登錄編輯器輕鬆地併入系統登錄中。
- 您也可以使用 [AddReg] 區段來建立 .inf 檔案,其中包含要新增的登錄資訊。
- Regedt32.exe 可用來手動將資訊新增至登錄。
掃描代碼對應程式有數個優點和缺點。
優點包括:
- Mapper 可用來作為修正韌體錯誤的簡單修正。
- 常用機碼可以藉由修改登錄中的對應,新增至鍵盤。 例如,不常使用 (的索引鍵,右 CTRL 鍵) 可以對應至 null (移除) 或交換給其他索引鍵。
- 您可以輕易地變更主要位置。 用戶可以輕鬆地自定義常用密鑰的位置,以取得其權益。
可辨識下列缺點:
- 一旦對應儲存在登錄中,需要重新啟動系統才能加以啟用。
- 儲存在登錄中的對應會在系統層級工作,並套用至所有使用者。 根據目前的使用者,這些對應無法設定為以不同的方式運作。
- 目前的實作會限制地圖的功能,讓對應一律套用至連線至系統的所有鍵盤。 目前無法為每個鍵盤建立地圖。
查詢滑鼠裝置
I8042prt 支援下列內部裝置控制要求,以查詢滑鼠裝置的相關信息:
如需所有滑鼠裝置控制要求的詳細資訊,請參閱 Human Interface Devices Reference。
與滑鼠類別驅動程式相關聯的登錄設定
以下是與滑鼠類別驅動程式相關聯的登錄機碼清單。
[機碼:HKLM\SYSTEM\CurrentControlSet\Services\一個集區\Parameters]
- MaximumPortsServiced – 不適用於 Windows XP 和更新版本。 僅適用於 Windows NT4。
- PointerDeviceBaseName – 指定滑鼠類別設備驅動器所建立之裝置物件的基底名稱
- ConnectMultiplePorts – 判斷每個類別裝置物件是否有一或多個埠裝置物件。 此專案主要是由設備驅動器使用。
- MouseDataQueueSize - 指定滑鼠驅動程式緩衝的滑鼠事件數目。 它也用於計算非分頁記憶體集區中滑鼠驅動程式內部緩衝區的大小。
絕對指向裝置
針對類型 為 GUID_CLASS_MOUSE的裝置,裝置的函式驅動程式:
處理裝置特定的輸入。
藉由在其 ISR 分派完成例程中呼叫 MouseClassServiceCallback ,將MOUSE_INPUT_DATA結構傳送至MOUSE_INPUT_DATA類別數據佇列。
對於絕對指向裝置,裝置的函式驅動程序必須以下列方式設定MOUSE_INPUT_DATA結構的 LastX、 LastY 和 Flags 成員:
除了將裝置輸入值除以裝置的最大功能之外,驅動程式還會0xFFFF調整裝置輸入值:
LastX = ((device input x value) * 0xFFFF ) / (Maximum x capability of the device) LastY = ((device input y value) * 0xFFFF ) / (Maximum y capability of the device)
驅動程式會在 Flags 中設定MOUSE_MOVE_ABSOLUTE旗標。
如果視窗管理員應該將輸入對應至整個虛擬桌面,驅動程式會在 Flags 中設定MOUSE_VIRTUAL_DESKTOP旗標。 如果未設定MOUSE_VIRTUAL_DESKTOP旗標,視窗管理員只會將輸入對應至主要監視器。
下列會依裝置類型指定如何實作絕對指向裝置的這些特殊需求:
HID 裝置:
適用於 HID 滑鼠裝置的 Windows 函式驅動程式,會自動實作這些特殊需求。
PS/2 樣式裝置:
需要高階篩選驅動程式。 篩選驅動程式會提供IsrHook回呼和類別服務回呼。 I8042prt 會呼叫 IsrHook 來處理原始裝置輸入,並呼叫篩選類別服務回呼來篩選輸入。 篩選類別服務回呼會接著呼叫 MouseClassServiceCallback。 IsrHook 回呼和類別服務回呼的組合會處理裝置特定的輸入、建立必要的MOUSE_INPUT_DATA結構、調整裝置輸入數據,以及設定MOUSE_MOVE_ABSOLUTE旗標。
隨插即用 Serenum 列舉的 COM 連接埠裝置:
需要 隨插即用 函式驅動程式。 函式驅動程式會建立必要的MOUSE_INPUT_DATA結構、調整裝置輸入數據,並在呼叫 MouseClassServiceCallback 之前設定MOUSE_MOVE_ABSOLUTE旗標。
非 隨插即用 COM 埠裝置:
需要裝置特定的函式驅動程式。 函式驅動程式會建立必要的MOUSE_INPUT_DATA結構、調整裝置輸入數據,並在呼叫 MouseClassServiceCallback 之前設定MOUSE_MOVE_ABSOLUTE旗標。
不支援總線上的裝置:
需要裝置特定的函式驅動程式。 函式驅動程式會建立必要的MOUSE_INPUT_DATA結構、調整裝置輸入數據,並在呼叫 MouseClassServiceCallback 之前設定MOUSE_MOVE_ABSOLUTE旗標。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應