原始輸入概觀

傳統鍵盤和滑鼠旁邊有許多使用者輸入裝置。 例如,使用者輸入可以來自搖桿、觸控式螢幕、麥克風或其他裝置,以允許使用者輸入的絕佳彈性。 這些裝置統稱為「人類介面裝置」, (HID) 。 原始輸入 API 提供穩定且健全的方式,讓應用程式接受來自任何 HID 的原始輸入,包括鍵盤和滑鼠。

本節包含下列主題:

原始輸入模型

先前,鍵盤和滑鼠通常會產生輸入資料。 系統會解譯來自這些裝置的資料,以消除原始資訊的裝置特定詳細資料。 例如,鍵盤會產生裝置特定的掃描碼,但系統會提供具有虛擬按鍵碼的應用程式。 除了隱藏原始輸入的詳細資料之外,視窗管理員不支援所有新的 HID。 若要從不支援的 HID 取得輸入,應用程式必須執行許多動作:開啟裝置、管理共用模式、定期讀取裝置或設定 I/O 完成埠等等。 原始輸入模型和相關聯的 API 已開發,以允許從所有輸入裝置輕鬆存取原始輸入,包括鍵盤和滑鼠。

原始輸入模型與鍵盤和滑鼠的原始 Windows 輸入模型不同。 在原始輸入模型中,應用程式會以傳送或張貼至其視窗的訊息形式接收裝置獨立輸入,例如 WM_CHARWM_MOUSEMOVEWM_APPCOMMAND。 相反地,針對原始輸入,應用程式必須註冊想要從中取得資料的裝置。 此外,應用程式會透過 WM_INPUT 訊息取得原始輸入。

原始輸入模型有幾個優點:

  • 應用程式不需要偵測或開啟輸入裝置。
  • 應用程式會直接從裝置取得資料,並處理其需求的資料。
  • 即使輸入來源與相同類型的裝置,應用程式也可以區分輸入的來源。 例如,兩個滑鼠裝置。
  • 應用程式會藉由指定來自裝置集合或僅限特定裝置類型的資料,來管理資料流量。
  • HID 裝置可在市集中使用時使用,而不需要等候新的訊息類型或更新的 OS 在 WM_APPCOMMAND中擁有新的命令。

請注意 ,WM_APPCOMMAND 會提供某些 HID 裝置。 不過, WM_APPCOMMAND 是較高層級的裝置獨立輸入事件,而 WM_INPUT 傳送裝置專屬的原始低階資料。

原始輸入的註冊

根據預設,不會有任何應用程式收到原始輸入。 若要從裝置接收原始輸入,應用程式必須註冊裝置。

若要註冊裝置,應用程式會先建立 RAWINPUTDEVICE 結構的陣列,以指定最 上層集合 (TLC) 。 TLC 是由 使用量頁面 所定義, (裝置的類別) ,以及類別內裝置 (使用量 識別碼) 。 例如,若要取得鍵盤 TLC,請設定 UsagePage = 0x01,而 UsageID = 0x06。 應用程式會呼叫 RegisterRawInputDevices 來註冊裝置。

請注意,應用程式可以註冊目前未連結至系統的裝置。 連結此裝置時,Windows 管理員會自動將原始輸入傳送至應用程式。 若要取得系統上的原始輸入裝置清單,應用程式會呼叫 GetRawInputDeviceList。 使用來自此呼叫 的 hDevice ,應用程式會呼叫 GetRawInputDeviceInfo 以取得裝置資訊。

透過RAWINPUTDEVICEdwFlags成員,應用程式可以選取要接聽的裝置,以及想要忽略的裝置。 例如,應用程式可以從所有電話語音裝置要求輸入,但回應電腦除外。 如需範例程式碼,請參閱 註冊原始輸入

請注意,滑鼠和鍵盤也是 HID,因此來自它們的資料可以同時通過 HID 訊息 WM_INPUT 和來自傳統訊息。 應用程式可以藉由 RAWINPUTDEVICE中適當的旗標選取來選取任一方法。

若要取得應用程式的註冊狀態,請隨時呼叫 GetRegisteredRawInputDevices

讀取原始輸入

應用程式會從 最上層集合 (TLC 的任何 HID 接收原始輸入,) 符合來自註冊的 TLC。 當應用程式收到原始輸入時,其訊息佇列會取得 WM_INPUT 訊息,而佇列狀態旗標 QS_RAWINPUT 設定 (QS_INPUT 也包含此旗標) 。 應用程式可以在前景和背景時接收資料。

有兩種方式可讀取原始資料:未緩衝 (或標準) 方法和緩衝方法。 未緩衝的方法一次會取得一個 RAWINPUT 結構的原始資料,而且適用于許多 HID。 在這裡,應用程式會呼叫 GetMessage 以取得 WM_INPUT 訊息。 然後,應用程式會使用包含在WM_INPUT中的RAWINPUT控制碼來呼叫GetRawInputData。 如需範例,請參閱 執行原始輸入的標準讀取

相反地,緩衝方法一次會取得 RAWINPUT 結構的陣列。 這是針對可產生大量原始輸入的裝置所提供。 在此方法中,應用程式會呼叫 GetRawInputBuffer 來取得 RAWINPUT 結構的陣列。 請注意, NEXTRAWINPUTBLOCK 宏是用來周遊 RAWINPUT 結構的陣列。 如需範例,請參閱 執行原始輸入的緩衝讀取

若要解譯原始輸入,需要 HID 的詳細資訊。 應用程式會透過使用裝置控制碼呼叫 GetRawInputDeviceInfo 來取得裝置資訊。 此控制碼可以來自WM_INPUTRAWINPUTHEADERhDevice成員。

另請參閱