本文件詳述了連接相容 Windows 11 主機的觸覺筆裝置的協定實作。 這不包括對機械約束、電氣限制或元件選擇的指導,以產生筆型換能器內的觸覺響應。 此實作指引與筆型換能器與筆數位化器之間的筆型協定無關,但實作者可選擇使用具備上行功能的筆型協定,使筆數位化器能為筆型換能器提供額外參數,以調節觸覺反應。
裝置類別
觸覺筆是 Windows 筆裝置類別的擴充。 本實作指南對應於筆型實作指南,重點在於實現在筆型換能器中的觸覺功能。此外,觸覺筆除了必須符合本書中的要求之外,還須符合筆型實作指南的要求。
裝置匯流排連線
觸覺筆應使用 Microsoft 提供的收件匣驅動程式,透過藍牙連接 HID 與 Windows 主機。
觸覺筆協定實作
需要充分了解 HID 協議才能理解此處提供的信息。 如需 HID 通訊協定的相關資訊,請參閱下列資源:
Windows 內建 HID 類別驅動程式及相應的 HID 藍牙迷你埠驅動程式,因此不需要第三方迷你埠驅動程式。 觸覺筆裝置韌體只需回報本主題中描述的使用情況。 Windows 將使用固件和自己的 HID 驅動程序來啟用設備並授予 Windows 應用程序對設備的訪問權限。
範例描述元在下方的範例報表描述元區段中提供。
必要的頂層 HID 集合
觸覺筆裝置在 Windows 10 系統上應該以 HID 協定運作,讓裝置提供一個被視為數位板/觸控筆的最高層級集合(頁面 0x0D,用途 0x20)。
筆數位化器輸入報告
筆數位化器集合必須在提交給操作系統的輸入報告中回報由換能器序號與換能器廠商 ID 組成的觸控筆識別碼。 必須在觸控筆集合中回報相同的觸控筆識別碼。 這使得作業系統能夠將數位化器產生的筆輸入與觸控筆進行關聯。 關於筆實作指南的詳細資訊可在此找到: 筆協定實作。
換能器序號
換能器序號是用於筆型配件與筆數位化器通訊時,唯一且持久的識別碼。 這需要 32 位元,並由由換能器廠商 ID 所識別的廠商或實體定義。 若數位化器不知道換能器序號,無論是因為筆型配件不支援傳送此數值,或是傳輸尚未完整接收,數位化器應向主機回報 0。 空位置不被主機支援。
換能器序號 – 第二部分
換能器序號 – 第二部分允許額外指定 32 位元作為筆式配件中換能器唯一持久識別碼的一部分。 如果數位化器不知道 Transducer 序號 – 第二部分,可能是因為筆配件不支援傳輸此數值,或者是傳輸尚未完整被接收,那麼數位化器應向主機回報 0。 空位置不被主機支援。
| 頁面 | ID | 註釋 |
|---|---|---|
| 0xD | 0x5B | 必須為依賴唯一筆識別的功能(見下文)提供支持 |
| 0xD | 0x6E | 可選擇將序號額外延長32位元 |
換能器廠商識別碼
換能器廠商識別碼是用於標示使用於筆型配件中的換能器製造商的欄位,該配件與筆數位化器進行通訊。 此 ID 必須是由 USB-IF 指定的 2 位元組廠商 ID,可以是製造商的 ID,或者是 IHV/OEM 授權用於此目的的 USB-IF 廠商 ID。
| 頁面 | ID | 註釋 |
|---|---|---|
| 0xD | 0x91 | 必須為依賴唯一筆識別的功能(見下文)提供支持 |
唯一筆識別所依賴的功能
啟用各種功能(例如筆觸回饋)需要強制性報告 PenID(觸覺功能的必需條件在本指南中說明)。
對於使用多支筆進行描線的情境,這也是必須的。 例如:
- Windows 上的白板應用程式支援多次筆使用,每支筆可以對應到特定的墨線工具
- 一般來說,即使數位化器可能僅支援同一時間在螢幕上使用一支筆,應用程式仍然可以為不同的實體筆指派屬性或行為。
- 想要在支援的數位板上追蹤多支觸控筆的應用程式
觸覺輸出報告
若筆裝置支援觸覺回饋,系統與應用程式可透過在觸控筆 TLC 中加入觸覺反饋集合(頁 0x0E、使用0x01)來利用此功能。 欲了解更多關於 HID 規範如何支援觸覺回饋的資訊,請參閱 HID 規範的觸 覺頁面 確認。
主機在輸出報告中(透過觸覺回饋收集)使用以下使用方式,允許主機向觸覺筆裝置發出觸覺反饋事件。 若裝置選擇公開觸覺回饋收集,某些用途是必要的,以允許支援主機發起的觸覺回饋。
| 會員 | Description | 頁面 | ID | 強制/選擇性 |
|---|---|---|---|---|
| 波形清單 | 裝置支援的有序觸覺波形列表 | 0x0E | 0x10 | 強制的 |
| 持續時間列表 | 波形列表中波形持續時間的排序列表 | 0x0E | 0x11 | 強制的 |
| 自動觸發 | 波形可依裝置自行決定自動發射 | 0x0E | 0x20 | 強制的 |
| 自動觸發關聯控制項 | HID 對觸覺回饋控制的使用 | 0x0E | 0x22 | 強制的 |
| 強烈 | 輸出 - 手動觸發波形的強度百分比 | 0x0E | 0x23 | 可選 |
| 重複計數 | 輸出 - 初始播放後手動觸發波形的播放次數 | 0x0E | 0x24 | 可選 |
| 重新觸發期間 | 輸出 - 重複時,在重新觸發手動觸發之前的等待時間長度 | 0x0E | 0x25 | 可選 |
| 波形截止時間 | 手動觸發波形在被切斷前,最多可播放的時間 | 0x0E | 0x28 | 可選 |
波形清單
波形清單使用代表的是一組所支援的HID用途之波形,並根據序數順序排列。 預先定義的觸覺波形在 HID 規範中有所定義。 對於筆式觸覺裝置,這些波形可分為兩個對應不同情境的段:
- WAVEFORM_*CONTINOUS - 基於墨水的反饋,模擬使用者在用筆、鉛筆等不同工具進行描墨時的各種材質。
- WAVEFORM_* - 當使用者執行某些輸入驅動任務(如滑鼠移至按鈕、點擊停用按鈕及成功辨識墨水形狀)時,提供離散且非連續的互動回饋。
以下為筆式觸覺裝置所支援的完整波形清單:
| 波形 | Description | 頁面 | ID | 強制/選擇性 |
|---|---|---|---|---|
| WAVEFORM_NONE | 無操作。 不應影響正在進行的波形的播放狀態 | 0x0E | 0x1001 | 強制的 |
| WAVEFORM_STOP | 停止播放正在進行的波形 | 0x0E | 0x1002 | 強制的 |
| 波形點擊 | 產生一個短促的「點擊」回饋。 當應用程式選擇的互動回饋波形無法受到觸感筆支援時,啟動預設回退機制 | 0x0E | 0x1003 | 強制的 |
| WAVEFORM_INKCONTINUOUS | 模擬用實體原子筆描墨的手感。 當觸控筆不支援書寫波形時,預設回退 | 0x0E | 0x100B | 強制的 |
| 波形_成功 | 強烈的觸覺信號提醒用戶操作已成功 | 0x0E | 0x1009 | 可選 |
| WAVEFORM_ERROR | 強烈觸覺信號提醒用戶操作失敗或發生錯誤 | 0x0E | 0x100A | 可選 |
| WAVEFORM_HOVER | 當使用者用觸覺筆將滑鼠移到互動式 UI 元素上時,會產生觸覺訊號 | 0x0E | 0x1008 | 可選 |
| WAVEFORM_PRESS | 當使用者在增量動作中按下互動式介面元素時的觸覺訊號(參見發布) | 0x0E | 0x1006 | 可選 |
| WAVEFORM_RELEASE | 觸覺訊號,用於使用者在增量動作中釋放互動式 UI 元素(參見 Press) | 0x0E | 0x1007 | 可選 |
| WAVEFORM_PENCILCONTINUOUS | 使用者選擇鉛筆作為描線工具時,會持續提供觸覺反饋 | 0x0E | 0x100C | 可選 |
| WAVEFORM_MARKERCONTINUOUS | 使用者選擇麥克筆作為描線工具時,會有持續的觸覺回饋。 | 0x0E | 0x100D | 可選 |
| WAVEFORM_CHISELMARKERCONTINUOUS | 當使用者選擇鑿子筆或螢光筆作為描線工具時,會有持續的觸覺訊號 | 0x0E | 0x100E | 可選 |
| WAVEFORM_BRUSHCONTINUOUS | 當使用者選擇筆刷作為墨跡工具時,會有持續的觸覺訊號 | 0x0E | 0x100F | 可選 |
| WAVEFORM_ERASERCONTINUOUS | 使用者在墨線工具中選擇橡皮擦時,會持續有震動反饋。 | 0x0E | 0x1010 | 可選 |
| WAVEFORM_SPARKLECONTINUOUS | 針對特殊墨水工具(如多色畫筆)的連續觸覺訊號 | 0x0E | 0x1011 | 可選 |
備註
雖然非強制,但鼓勵也實作其他列舉的波形,以提供更完整的使用者體驗。 特別是,WAVEFORM_PRESS 和 WAVEFORM_RELEASE 非常推薦,因為它們提供了寶貴的互動回饋。
所有符合HID標準的觸覺裝置都必須具備WAVEFORM_NONE與WAVEFORM_STOP。 序數 1 和 2 隱含地設定為 WAVEFORM_NONE 和 WAVEFORM_STOP。 它們不需要在波形清單或持續時間清單中宣告。 波形列表以列表中每個序數的物理最小值與最大值宣告支持波形。
持續時間列表
時值清單的使用代表波形列表中所支援波形的時長集合,並以序數排序。 波形持續時間的單位為毫秒,且對任何非連續波形,持續時間必須是正且非零的值。 若波形為連續(會播放直到主持人停止或波形截止時間超過),則其持續時間定義為零。
WAVEFORM_NONE 和 WAVEFORM_STOP 假設其持續時間為零。 它們不需要在期限清單中申報。
強烈
強度使用表示應用於波形的最大強度百分比。 這個數值應該在0到100%之間變化。 100% 表示裝置會以最大強度觸發波形,0% 表示觸覺換能器未啟用。
重複計數
重複計數的使用代表重複一個波形的次數。 重複計數為零表示手動觸發波形只能播放一次(不得重複)。 若波形截止時間已超過,預期任何不完整的重複將被忽略。
重新觸發期間
重觸發週期用於表示裝置在輸出報告中根據重複次數指定的值,在再次手動觸發波形之前需等待的時間。 此數值的單位為毫秒。 如果重觸發週期短於播放波形的持續時間,則應在重觸發週期所指示的時間點停止並重新啟動波形。
波形截止時間
波形截止時間使用代表裝置允許手動觸發波形重複的最大時間,直到結束播放。 這是裝置的常數值,包含無固定時長的連續波形,以及設定為多次重複且具有離散波長的波形。 此數值的單位為毫秒。
觸覺輸出報告
主機在輸出報告中使用以下用法向觸覺筆裝置發出觸覺回饋事件。 部分使用方式為與 Windows 主機實作相容而必須。
| 會員 | Description | 頁面 | ID | 強制/選擇性 |
|---|---|---|---|---|
| 手動觸發 | 波形作為主機的明確命令觸發 | 0x0E | 0x21 | 強制的 |
| 強烈 | 手動觸發波形強度百分比 | 0x0E | 0x23 | 強制的 |
| 重複計數 | 初次播放後,手動觸發波形播放的次數 | 0x0E | 0x24 | 可選 |
| 重新觸發期間 | 在重複觸發之前,需等待一段時間後再手動觸發。 | 0x0E | 0x25 | 可選 |
手動觸發
手動觸發用途代表由主機請求播放的波形列表中支援的波形用途。 當一份包含非 WAVEFORM_NONE 的手動觸發的輸出報告被送達裝置時,裝置應立即開始播放報告中指定的波形,同時應用輸出報告中包含的額外屬性(強度、重複次數、重新觸發周期)。 當輸出報告中含有手動觸發的WAVEFORM_STOP指令時,應停止任何正在進行的波形播放。
關於 強度、 重複計數及 重觸發週期 的使用情況,請參閱前一節關於輸出特徵報告的相關內容。
啟動與停止觸覺
下方流程圖說明筆觸覺訊號應何時設定、清除、啟動與停止。
以下描述的各種觸覺狀態如下:
- 播放中:筆正在播放觸覺波形
- 暫停:筆已設定波形,但未積極播放
- 停止:筆沒有設定波形,也沒有在積極播放任何東西
關於數位板的筆狀態,請參考 Windows Pen States。
備註
當觸控筆超出範圍時,建議但不是必須,先清除觸覺設定。 在下方的圖表中,當筆超出範圍時,會透過「筆:在範圍內;觸覺:暫停」這個狀態的兩條替代路徑來傳達。
備註
主持人隨時可請求播放非連續波形。 在這種情況下,筆應該播放它,然後回到之前的狀態。
備註
主機只能設定連續波形。 離散/非連續波形只能手動觸發。
鍵盤收藏(選配)
可選擇的功能,能夠通過 HID 鍵盤報告將尾端按鈕點擊情況傳送給主機。
相容裝置應透過暴露給主機的 HID 藍牙鍵盤裝置,回報三種不同的鍵盤組合,對應三種不同的按鍵操作。 以下列出了操作方式及相應的鍵盤組合:
| 按鍵動作 | 鍵組合 |
|---|---|
| 單次點擊 | WIN+F20 |
| 雙擊 | WIN+F19 |
| 按壓與保持 | Win+F18 |
藍牙按鈕實作
為了實作尾端藍牙按鈕,裝置會透過暴露給主機的 HID 藍牙 LE 鍵盤裝置,回報三種不同的鍵盤組合,對應三種不同的按鍵操作。 以下列出了操作方式及相應的鍵盤組合:
| 藍牙按鈕動作 | 要報告的鍵組合 |
|---|---|
| 單擊 | WIN+F20 |
| 按兩下 | WIN+F19 |
| 按住 | WIN+F18 |
筆插槽
從 Windows 10 版本 1903 開始,Windows 支援具備相容筆收納功能的裝置通知。 此機制依賴於硬體偵測筆的移除或放回,並針對一對快捷鍵組合產生對應的 HID 鍵盤報告。 若要指示停靠(筆已置於存放區),則回報 WIN+CTRL+F20;若要指示脫離停靠(筆已自存放區取出),則回報 WIN+CTRL+F19。 這可以透過韌體或驅動程式來實現。
這些卸載/停靠事件會顯示或關閉 Shell 墨水工作區選單。 從 Windows 10 開始,2004 版 Office 也會透過平台 API 回應這些事件,讓任何開發者都能擴展應用程式以感知儲存事件。 沒有支援查詢筆是否存在於底座,只有當應用程式在前景時,才會收到移除與返回事件的通知。
範例 HID 報表描述元
05,0D, // Usage Page (Digitizers)
09,20, // Usage (Stylus)
A1,01, // Collection (Application)
85,40, // Report ID (64)
95,01, // Report Count (1)
75,20, // Report Size (32)
17,00,00,00,80, // Logical Minimum (-2147483648)
27,FF,FF,FF,7F, // Logical Maximum (2147483647)
09,5B, // Transducer Serial Number
81,02, // Input (Data,Var,Abs)
75,10, // Report Size (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
09,91, // Transducer Vendor ID
81,02, // Input (Data,Var,Abs)
05,0E, // Usage Page (Haptics)
09,01, // Usage (0x01)
A1,02, // Collection (Logical)
85,41, // Report ID (65)
95,01, // Report Count (1)
75,08, // Report Size (8)
15,01, // Logical Minimum (1)
26,FF,00, // Logical Maximum (255)
09,24, // Usage (0x24)
B1,02, // Feature (Data,Var,Abs)
09,24, // Usage (0x24)
91,02, // Output (Data,Var,Abs)
09,23, // Usage (0x23)
B1,02, // Feature (Data,Var,Abs)
09,23, // Usage (0x23)
91,02, // Output (Data,Var,Abs)
15,01, // Logical Minimum (1)
25,12, // Logical Maximum (18)
09,20, // Usage (0x20)
B1,02, // Feature (Data,Var,Abs)
09,21, // Usage (0x21)
91,02, // Output (Data,Var,Abs)
15,00, // Logical Minimum (0)
26,FE,00, // Logical Maximum (254)
66,01,10, // Unit (SI Linear)
55,FD, // Unit Exponent (253)
35,00, // Physical Minimum (0)
46,EC,09, // Physical Maximum (2540)
09,28, // Usage (0x28)
91,02, // Output (Data,Var,Abs)
75,10, // Report Size (16)
26,D0,07, // Logical Maximum (2000)
46,D0,07, // Physical Maximum (2000)
09,25, // Usage (0x25)
91,02, // Output (Data,Var,Abs)
09,25, // Usage (0x25)
B1,02, // Feature (Data,Var,Abs)
45,00, // Physical Maximum (0)
85,42, // Report ID (66)
75,20, // Report Size (32)
17,42,00,0D,00, // Logical Minimum (852034)
27,42,00,0D,00, // Logical Maximum (852034)
09,22, // Usage (0x22)
B1,02, // Feature (Data,Var,Abs)
09,11, // Usage (0x11)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
75,10, // Report Size (16)
95,10, // Report Count (16)
15,01, // Logical Minimum (1)
27,FF,FF,00,00, // Logical Maximum (65535)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
05,0E, // Usage Page (Haptics)
09,10, // Usage (0x10)
A1,02, // Collection (Logical)
05,0A, // Usage Page (Ordinal)
16,03,10, // Logical Minimum (4099)
26,FF,2F, // Logical Maximum (12287)
19,03, // Usage Minimum (0x03)
29,12, // Usage Maximum (0x12)
B1,02, // Feature (Data,Var,Abs)
C0, // End Collection ()
C0, // End Collection ()
C0 // End Collection ()