針對 HID 報告進行疑難解答

本文說明嘗試擷取或設定 HID 使用方式時,使用者模式應用程式和內核模式驅動程式可能會遇到的最常見問題。

HID 報告標識碼錯誤

當應用程式或驅動程式從 HID 集合收到 HID 報表時,它可以是集合包含 (的任何報表,因為集合可以依任何順序傳回報表) 。 HidP_GetXxx 例程會傳回下列狀態值,指出報告標識碼錯誤:

HIDP_STATUS_INCOMPATIBLE_REPORT_ID
要求的使用量位於 HID 集合所支援的報表中,但在應用程式或驅動程式指定的報表中則不是 。

HIDP_STATUS_USAGE_NOT_FOUND
要求的使用方式不在最上層集合所支援的任何報表中。

例如,下圖顯示包含兩個報表的 HID 集合。

說明包含兩個報表之 hid 集合的圖表。

根據這個範例,假設應用程式或驅動程式收到集合中的報表,並呼叫 HidP_GetUsageValue 以擷取目前值 「Value X」。如果報表的標識碼是七個,例程會傳回HIDP_STATUS_INCOMPATIBLE_REPORT_ID,這表示裝置支援 Value X,但報表中沒有值 X。 另一方面,如果應用程式或驅動程式要求 「Value Z」 的值,則例程會傳回HIDP_STATUS_USAGE_NOT_FOUND,這表示值 Z 不在集合支援的任何報表中。

當應用程式或驅動程式使用 HidP_SetXxx 例程來設定報表中的使用量時,例程也可以傳回相同的兩個狀態值。 HIDP_STATUS_USAGE_NOT_FOUND的意義與 HidP_GetXxx 例程相同。 不過,HIDP_STATUS_INCOMPATIBLE_REPORT_ID的意義不同。 這個狀態值表示報表先前已設定報表標識符,而呼叫端指定的使用方式不屬於該報表標識符。 使用上圖作為範例,在應用程式或驅動程式使用 HidP_SetUsages 在零初始化報表中設定 「Button 2」 之後,報表會設定為七個報表標識碼。 如果應用程式或驅動程式後續嘗試在相同的報告中使用 HidP_SetUsageValue 來設定 「Value X」,則例程會傳回HIDP_STATUS_INCOMPATIBLE_REPORT_ID。

如果 **HidP_**Xxx 例程傳回HIDP_STATUS_INCOMPATIBLE_REPORT_ID,呼叫端應該採取下列其中一個動作:

  • 如果呼叫端正在設定使用方式,它應該配置長度正確的新報表、將其初始化為零,然後再次呼叫例程。 呼叫端可以在成功設定報表中的所有使用方式之後,將報表傳送至集合。

  • 如果呼叫端正在擷取使用方式,它應該使用從集合取得的不同報表來呼叫例程。

已卸除的 HID 報告

HID 用戶端驅動程式從 HID 集合取得輸入報告時,這些報告會儲存在 HID 類別驅動程式所維護的通道緩衝區中。 此機制可減少應用程式或驅動程式遺漏所需的輸入報告的可能性。

根據預設,HID 類別驅動程式會維護保留 32 個報告的輸入報告通道緩衝區。 如果集合將數據傳輸至 HID 類別驅動程式的速度比使用者模式應用程式或內核模式驅動程式從緩衝區擷取數據,則輸入報告會因為緩衝區溢位而遺失。 若要減少緩衝區溢位的可能性,應用程式或驅動程式可以重新設定緩衝區的報表數目大小。 驅動程式會使用 IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS 要求和 IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS 要求來擷取和變更緩衝區的大小。 應用程式會藉由呼叫 HidD_GetNumInputBuffersHidD_SetNumInputBuffers 來執行相同的作業。