關於原始輸入

關於原始輸入


  其實,除了傳統的鍵盤與鼠標外還有很多輸入設備,例如遊戲杆、觸摸屏、麥克風或其他更靈活的輸入設備。 這些設備統稱爲人類接口設備(Human Interface Devices)簡稱HID。原始輸入(raw input)API提供了對任意HID原始輸入的穩定及健壯支持,其中就包括鍵盤和鼠標。

  本節涵蓋以下內容:

  • 原始輸入模型
  • 登記原始輸入設備
  • 獲取原始輸入數據

原始輸入模型

  以前,通常用鍵盤及鼠標作爲輸入設備,系統是通過去除原始信息中的設備特定描述來解釋這些設備數據的。例如,鍵盤產生設備特定的掃描碼,但系統提供給應用程序的卻是虛鍵碼(virtual key code)。除了支持隱藏原始輸入細節的設備外,窗口管理器不支持所有的新HID。要從不支持的HID中獲取輸入的話,應用程序不得不做許多事情:打開一個設備、管理共享模式、週期性的讀取設備或者建立I/O completion port等等。原始輸入模型及API簡化了這些操作,使得我們可以很簡單的訪問所有原始輸入設備的原始輸入數據,其中就包含鍵盤及鼠標。

  原始輸入模型同原來的鍵盤、鼠標的Microsoft® Windows®輸入模型不同,原來的模型中,應用程序以發送或提交到窗體的消息的形式接收設備無關輸入,如<?XML:NAMESPACE PREFIX = MSHELP />WM_CHAR、WM_MOUSEMOVE及WM_APPCOMMAND。 與之對應,原始輸入的應用程序必須登記需要獲取數據的設備。然後,應用程序就可以通過WM_INPUT消息接收原始輸入了。

  下面是一些原始輸入模型的優點:

  • 應用程序沒有必要非得檢測或打開一個輸入設備了;
  • 應用程序直接從設備獲取數據,並可以僅處理它需要的數據;
  • 即便有同種類型的設備,應用程序也可以識別源輸入。例如有兩個鼠標的話。
  • 應用程序可以指定一組特定的設備或者僅指定設備類型來進行數據通信。
  • 只要市場有貨,HID設備就可以使用,而不必等待系統支持新的消息類型或更新OS以在WM_APPCOMMAND中包含新的命令。

  注意:WM_APPCOMMAND的確提供對某些HID設備的支持,然而,WM_APPCOMMAND是一個更高級的設備無關的輸入事件,而WM_INPUT發送低級的原始數據。

登記原始輸入設備

  默認情況下,應用程序不會接收原始輸入,要接收原始數據的話,就必須首先登記輸入設備。

  要登記設備的話,首先要創建一個RAWINPUTDEVICE結構的數組,其中包含設備的頂級集合(top level collection)(TLC)。TLC是通過一個Usage Page(設備類)及一個Usage(類內部設備)定義的。例如,要得到鍵盤TLC的話,需要設置UsagePage = 1並且Usage = 6,然後調用RegisterRawInputDevices來完成登記設備。

  注意:應用程序可以登記一個當前並未連到系統的設備。一旦設備連接,窗口管理器就會自動發送原始輸入到應用程序。要得到系統中原始輸入設備列表的話,可以調用GetRawInputDeviceList。使用調用中的hDevice,然後調用GetRawInputDeviceInfo就可以得到設備信息。

  通過RAWINPUTDEVICE的成員dwFlags,應用程序可以選擇需要的設備或者不需要哪些設備。例如,應用程序可以請求所有電話的輸入,但不包括應答機的。關於示例代碼,請參見“登記原始輸入設備”。

  注意:鼠標、鍵盤同樣也是HID,所以他們的數據可以通過HID消息WM_INPUT得到,也可以通過傳統的消息得到。應用程序可以通過設置RAWINPUTDEVICE中的選項標誌選定使用不同的方法。

  要獲取一個應用程序的設備登記情況,可以隨時通過GetRegisteredRawInputDevices調用得到。

獲取原始輸入數據

  應用程序會接收哪些頂級集合已經登記的HID的原始輸入,到收到原始輸入時,消息隊列中就會得到一個WM_INPUT消息,並且隊列狀態標誌QS_RAWINPUT被設置(QS_INPUT也包含該標誌)。應用程序無論在前臺或後臺都回收到數據。

  獲取原始數據有兩種方法:不緩存(標準)的方法及緩存的方法。不緩存的方法依次讀取一個RAWINPUT結構的數據,並且該方法對許多HID都適合。這裏,應用程序通過調用GetMessage來得到WM_INPUT消息,然後用WM_INPU中的RAWINPUT句柄調用GetRawInputData。示例請見“標準方式獲取原始輸入”。

  相對而言,緩存的方法一次得到一個RAWINPUT結構的數組。這比較適合那些可能產生大量原始輸入的設備。在該方法中,應用程序通過調用GetRawInputBuffer得到RAWINPUT結構數組。注意NEXTRAWINUPTBLOCK宏是爲了遍歷RAWINPUT結構數組。示例請參照“緩存方式讀取原始輸入”。

  要解釋原始輸入,就需要HID的詳細信息,可以通過GetRawInputDeviceInfo得到設備信息,其所需的設備句柄可以通過WM_INPUT或者RAWINPUTHEADER.hDevice獲得。


 

原文:About Raw Input,MSDN。
© 2003 Microsoft Corporation. All rights reserved.

翻譯:[email protected],2004-11-25止

發佈了40 篇原創文章 · 獲贊 3 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章