原始輸入概觀
傳統鍵盤和滑鼠旁邊有許多使用者輸入設備。 例如,使用者輸入可能來自遊戲桿、觸摸屏、麥克風或其他裝置,可讓使用者輸入有極大的彈性。 這些裝置統稱為「人類介面裝置」(HID)。 原始輸入 API 提供穩定且健全的方式,讓應用程式接受來自任何 HID 的原始輸入,包括鍵盤和滑鼠。
本節涵蓋下列主題:
原始輸入模型
先前,鍵盤和滑鼠通常會產生輸入數據。 系統會以消除原始資訊裝置特定詳細數據的方式解譯來自這些裝置的數據。 例如,鍵盤會產生裝置特定的掃描碼,但系統會提供具有虛擬按鍵碼的應用程式。 除了隱藏原始輸入的詳細數據之外,視窗管理員不支援所有新的 HID。 若要從不支援的 HID 取得輸入,應用程式必須執行許多動作:開啟裝置、管理共用模式、定期讀取裝置或設定 I/O 完成埠等等。 已開發原始輸入模型和相關聯的 API,以允許從所有輸入設備輕鬆存取原始輸入,包括鍵盤和滑鼠。
原始輸入模型與鍵盤和滑鼠的原始 Windows 輸入模型不同。 在原始輸入模型中,應用程式會以傳送或張貼至其視窗的訊息形式接收裝置無關的輸入,例如 WM_CHAR、WM_MOUSEMOVE和 WM_APPCOMMAND。 相反地,對於原始輸入,應用程式必須註冊想要從中取得數據的裝置。 此外,應用程式會透過 WM_INPUT 訊息取得原始輸入。
原始輸入模型有幾個優點:
- 應用程式不需要偵測或開啟輸入設備。
- 應用程式會直接從裝置取得數據,並處理數據以符合其需求。
- 即使輸入來源與裝置類型相同,應用程式也可以區分輸入的來源。 例如,兩個滑鼠裝置。
- 應用程式會指定來自裝置集合或僅限特定裝置類型的數據,以管理數據流量。
- HID 裝置一旦在市面上可以使用,就可以使用,而不需要等待新的訊息類型或更新的操作系統在 WM_APPCOMMAND中擁有新的命令。
請注意,WM_APPCOMMAND 確實提供某些 HID 裝置。 不過,WM_APPCOMMAND 是較高層級的裝置獨立輸入事件,而 WM_INPUT 傳送裝置特有的原始低階數據。
原始輸入的註冊
根據預設,應用程式不會接收原始輸入。 若要從裝置接收原始輸入,應用程式必須註冊裝置。
為了註冊裝置,應用程式會先建立 RAWINPUTDEVICE 結構陣列,以指定所要裝置 最上層集合 (TLC)。 TLC 是由 使用量頁面 定義(裝置的類別),以及 使用量標識碼(類別內的裝置)。 例如,若要取得鍵盤 TLC,請設定 UsagePage = 0x01,而 UsageID = 0x06。 應用程式會呼叫 RegisterRawInputDevices 來註冊裝置。
請注意,應用程式可以註冊目前未連結至系統的裝置。 連結此裝置時,Windows 管理員會自動將原始輸入傳送至應用程式。 若要取得系統上的原始輸入裝置清單,應用程式會呼叫 GetRawInputDeviceList。 使用來自此呼叫的 hDevice,應用程式會呼叫 GetRawInputDeviceInfo 來取得裝置資訊。
透過 dwFlagsRAWINPUTDEVICE的成員,應用程式可以選取要接聽的裝置,以及想要忽略的裝置。 例如,應用程式可以要求所有電信設備的輸入,但電話答錄機除外。 如需範例程式碼,請參閱 登錄原始輸入。
請注意,滑鼠和鍵盤也是 HID,因此來自它們的數據可以透過 HID 訊息 WM_INPUT 與傳統訊息。 應用程式可以藉由適當選取 RAWINPUTDEVICE 中的旗標來選取任一方法,。
若要取得應用程式的註冊狀態,請隨時呼叫 GetRegisteredRawInputDevices。
讀取原始輸入
應用程式會從任何 HID 接收原始輸入,其 最上層集合 (TLC) 符合註冊中的 TLC。 當應用程式收到原始輸入時,其消息佇列會取得 WM_INPUT 訊息,並設定佇列狀態旗標 QS_RAWINPUT(QS_INPUT 也包含此旗標)。 應用程式可以在前台和後台時接收資料。
有兩種方式可以讀取未經處理的數據:未緩衝的 (或標準) 方法和緩衝方法。 無緩衝方法會一次性獲取一個原始數據的 RAWINPUT 結構,並適合許多人體介面設備(HID)。 在這裡,應用程式會呼叫 GetMessage,以取得 WM_INPUT 訊息。 然後,應用程式會使用包含在 WM_INPUT中的 RAWINPUT 句柄,呼叫 getRawInputData。 如需範例,請參閱 標準讀取原始輸入。
相反地,緩衝方法一次會取得一組 RAWINPUT 結構。 這會提供給可產生大量原始輸入的裝置。 在此方法中,應用程式會呼叫 GetRawInputBuffer,以取得RAWINPUT 結構的 數位。 請注意,NEXTRAWINPUTBLOCK 巨集是用來遍歷 RAWINPUT 結構陣列的。 如需範例,請參閱 執行未經緩衝讀取的原始輸入。
若要解譯原始輸入,需要有關 HID 的詳細資訊。 應用程式會使用裝置句柄呼叫 GetRawInputDeviceInfo 來取得裝置資訊。 此句柄可以來自 WM_INPUT,或來自 RAWINPUTHEADER的 hDevice 成員。