HidP_TranslateUsagesToI8042ScanCodes函数 (hidpi.h)

HidP_TranslateUsagesToI8042ScanCodes 例程将HID_USAGE_PAGE_KEYBOARD使用情况页上的 HID 使用情况列表映射到各自的 PS/2 扫描代码(扫描代码集 1)。

语法

NTSTATUS HidP_TranslateUsagesToI8042ScanCodes(
  [in]           PUSAGE                        ChangedUsageList,
  [in]           ULONG                         UsageListLength,
  [in]           HIDP_KEYBOARD_DIRECTION       KeyAction,
  [in, out]      PHIDP_KEYBOARD_MODIFIER_STATE ModifierState,
  [in]           PHIDP_INSERT_SCANCODES        InsertCodesProcedure,
  [in, optional] PVOID                         InsertCodesContext
);

参数

[in] ChangedUsageList

指向键盘(按钮)用法列表的指针。 翻译用法例程将零解释为结束使用列表的分隔符。

[in] UsageListLength

指定更改的使用情况列表中可能的最大使用量。

[in] KeyAction

标识指定更改使用情况列表的关键方向。

typedef enum _HIDP_KEYBOARD_DIRECTION {
    HidP_Keyboard_Break,
    HidP_Keyboard_Make
} HIDP_KEYBOARD_DIRECTION;

HidP_Keyboard_Break

指定 方向(键向上)。 更改的使用情况列表包含设置为 OFF 的用法,这些用法以前设置为 ON(对应于以前关闭但现在已关闭的键)。

HidPKeyboard_Make

指定 方向(向下键)。 更改的使用情况列表包含设置为 ON 的用法,这些用法以前设置为 OFF(对应于以前启动但现在已关闭的键)。

[in, out] ModifierState

指向调用方维护供翻译用法例程使用的_HIDP_KEYBOARD_MODIFIER_STATE结构的指针。 修饰符状态结构标识键盘修饰符键的状态。

typedef struct _HIDP_KEYBOARD_MODIFIER_STATE {
    union {
      struct {
        ULONG LeftControl: 1;
        ULONG LeftShift: 1;
        ULONG LeftAlt: 1;
        ULONG LeftGUI: 1;
        ULONG RightControl: 1;
        ULONG RightShift: 1;
        ULONG RightAlt: 1;
        ULONG RigthGUI: 1;
        ULONG CapsLock: 1;
        ULONG ScollLock: 1;
        ULONG NumLock: 1;
        ULONG Reserved: 21;
      };
      ULONG ul;
};

修饰符状态结构的每个成员都标识相应的用法是设置为 ON (1) 还是 OFF (零)。

有关修饰符状态结构如何与翻译用法例程一起使用的详细信息,请参阅“备注”部分。

[in] InsertCodesProcedure

指向调用方提供的PHIDP_INSERT_SCANCODES类型的回调例程的指针,转换用法例程使用该例程将映射的扫描代码返回到翻译用法例程的调用方。

typedef BOOLEAN (*PHIDP_INSERT_SCANCODES)(
    IN PVOID  Context,
    IN PCHAR  NewScanCodes,
    IN ULONG  Length
    );

上下文

指向翻译用法例程调用方上下文的指针。 转换用法例程将 InsertCodesContext 指针传递给 InsertCodesProcedure 例程。

NewScanCodes

指向翻译用法例程返回给翻译用法例程调用方扫描代码的第一个字节的指针。

长度

指定扫描代码的长度(以字节为单位)。 扫描代码不能超过四个字节。

[in, optional] InsertCodesContext

指向转换用法例程传递给 InsertCodesProcedure 例程的调用方定义的上下文的指针。

返回值

HidP_TranslateUsagesToI8042ScanCodes 返回以下状态值之一:

返回代码 描述
HIDP_STATUS_SUCCESS
转换使用情况例程已成功映射已更改使用情况列表中的所有有效用法。
HIDP_STATUS_I8042_TRANS_UNKNOWN
已更改的使用情况列表中的用法映射到无效的键盘扫描代码。

言论

HidP_TranslateUsagesToI8042ScanCodes 按更改的使用情况列表中的键盘按钮用法按列表中发生的顺序映射,从 ChangedUsageList 处的值开始。 转换用法例程成功映射使用情况后,它使用调用方 InsertCodesProcedure 例程将相应的扫描代码返回到调用方。 转换用法例程继续映射列表中的使用情况,直到发生以下情况之一:列表中的使用量值为零;它映射由 UsageListLength指定的使用情况数;用法映射到无效的键盘扫描代码。

HidP_TranslateUsagesToI8042ScanCodes 主要用于处理循环中,该循环会反复确定当前使用情况列表(当前设置为 ON 的用法),将它们与以前的使用列表(以前设置为 ON 的用法)进行比较,并映射当前和以前的使用列表之间的差异,以便进行扫描代码和中断扫描代码。 以下作演示如何使用翻译用法例程。

在开始处理循环之前,处理代码通常会分配并初始化以下数据:

  • 以前的使用情况列表、当前使用情况列表、中断使用情况列表和使用情况列表。

    每个列表都是零初始化的用法数组。 为了确保处理代码映射可在连续 HID 输入报表之间更改的所有用法,处理代码必须将每个列表中的元素数设置为 HidP_GetUsages 可以为HID_USAGE_PAGE_KEYBOARD使用情况页返回的最大使用量。 此数字是使用 HidP_MaxUsageListLength获取的。

  • 由零初始化的_HIDP_KEYBOARD_MODIFIER_STATE结构供翻译用法例程使用。

    在处理循环中,代码必须维护此结构,以供翻译用法例程使用。 处理代码可以读取修饰键的状态,但代码不得修改结构。 转换用法例程使用此结构来维护有关修饰键状态的内部信息。

初始化所需结构后,处理循环的每个迭代通常包含以下作序列:
  1. 调用 HidP_GetUsages 以获取设置为 ON 的使用情况的当前使用情况列表。 将 get usages 例程的 UsagePage 输入参数设置为HID_USAGE_PAGE_KEYBOARD。
  2. 调用 HidP_UsageListDifference 将当前使用情况列表与以前的使用情况列表进行比较。 使用情况列表差异例程返回中断使用情况列表和使用情况列表。
  3. 调用翻译用法例程,将 ChangedUsageList 设置为中断使用情况列表,KeyAction HidP_KeyboardBreak,ModifierState 转换用法例程的处理代码维护的结构。 转换用法例程使用 InsertCodesProcedure回调例程将中断扫描代码返回到处理循环。
  4. 调用翻译用法例程,将 ChangedUsageList 设置为“生成使用情况”列表,KeyAction 为HidP_KeyboardMake,ModifierState 转换用法例程的处理代码维护的结构。 转换用法例程使用 InsertCodesProcedure回调例程将生成扫描代码返回到处理循环。
  5. 将以前的使用情况列表更新为当前使用情况列表。
有关 HID 用法与 PS/2 键盘扫描代码之间的映射的信息,请参阅 密钥支持和扫描代码 网站。

要求

要求 价值
最低支持的客户端 在 Windows 2000 及更高版本的 Windows 中可用。
目标平台 普遍
标头 hidpi.h (包括 Hidpi.h)
Hidparse.lib
IRQL <= DISPATCH_LEVEL

另请参阅

HidP_GetUsages

HidP_MaxUsageListLength

HidP_UsageListDifference