如何使用 InjectTouchInput() 和 PT_PEN on Windows 10 从数字转换器注入笔输入

How to inject pen inputs from a digitiser using InjectTouchInput() with PT_PEN on Windows 10

我在 Windows 10 上使用 InjectTouchInput() API 从单独的数字转换器注入触摸事件。这很好用(多点触控等)。那里有很多使用 API 的示例,即使用 PT_TOUCH 的指针类型,包括一个 from Microsoft,因此自定义它们并不难我的需求。

但是,我还没有找到任何使用其他指针类型的示例,尤其是 PT_PEN - 当数字转换器给我笔输入时我需要它。 (我也对 PT_MOUSE 感兴趣,主要是为了避免必须使用 SendInput()mouse_event()。)

每当我用 PT_PEN 调用 InjectTouchInput() 时,它都会失败并显示 ERROR_INVALID_PARAMETER。我已经尝试了很多字段组合来设置,但(到目前为止)没有任何效果。 MSDN文档没有描述PT_PEN要做什么(对PT_TOUCH描述不多,但至少有一个示例),所以很难知道哪些字段should 被设置,哪些 should 被忽略,任何特定的操作顺序等。我一直在网上搜索,但找不到任何示例PT_PEN使用。

是否有人有示例代码或知道在哪里可以找到任何示例代码、有用文档位于何处的知识,或者知道 InjectTouchInput() 应该如何用于 PT_PEN(和 PT_MOUSE)?

事实证明 InjectTouchInput() 确实仅适用于触摸输入 - 不适用于笔、鼠标或通用指针。

您可能会说这很明显,因为您将 POINTER_TOUCH_INFO 条目的数组传递给 API,但会出现混淆,因为 POINTER_TOUCH_INFO 的文档(以及所有后续文档)描述的内容主要是从解释给他的内容的人那里看到的,而不是他试图设置的内容, POINTER_INFO([=11=中的第一个元素]) 可以指定PT_POINTERPT_TOUCHPT_PENPT_MOUSEPT_TOUCHPAD的指针类型,所以感觉有点自然地认为“等等,我可以注入所有这些不同类型的指针!"

当然,所有的指针类型,尽管有 POINTER_INFO 的共同点,但采用的参数略有不同。例如,对于 PT_TOUCH(在 POINTER_TOUCH_INFO 中)有 orientationpressure,但是 tiltXtiltYrotation、和 pressure 用于 PT_PEN(在 POINTER_PEN_INFO 中);但是很容易确定哪些信息是相关的,因为指针类型始终是结构中的第一个字段。

InjectTouchInput() 可以接受 POINTER_PEN_INFO 个条目而不是 POINTER_TOUCH_INFO 个条目吗?不,它不能 - 我试过了,以防万一它会起作用。

Microsoft 似乎错失了从一开始就使 API 更通用并接受所有支持的指针类型,而不是仅限于触摸输入的机会。至少,笔式注入应该很简单,因为有一个 POINTER_PEN_INFO 结构(除了 POINTER_TOUCH_INFO 之外,我还没有找到其他指针类型的结构)。

从 2014 年开始 this thread 的一半是提到“没有 [...] API 用于笔式注射 ”,并且从那以后情况没有改善,所以仍然需要笔式注入的驱动程序。话虽如此,Windows UI Automation API 显然可以注入所有指针类型(以及用于启动的游戏手柄),但这仅在 Windows 10 周年纪念版中受支持(我还没试过)。

我们可以用InputInjector.InjectPenInput

实现笔输入注入

并且在win32中没有public笔注入的api。如果你的系统是Windows10,版本1809,InjectSyntheticPointerInput可以用。