如何使用 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_POINTER
、PT_TOUCH
、PT_PEN
、PT_MOUSE
或PT_TOUCHPAD
的指针类型,所以感觉有点自然地认为“等等,我可以注入所有这些不同类型的指针!"
当然,所有的指针类型,尽管有 POINTER_INFO
的共同点,但采用的参数略有不同。例如,对于 PT_TOUCH
(在 POINTER_TOUCH_INFO
中)有 orientation
和 pressure
,但是 tiltX
、tiltY
、rotation
、和 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可以用。
我在 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_POINTER
、PT_TOUCH
、PT_PEN
、PT_MOUSE
或PT_TOUCHPAD
的指针类型,所以感觉有点自然地认为“等等,我可以注入所有这些不同类型的指针!"
当然,所有的指针类型,尽管有 POINTER_INFO
的共同点,但采用的参数略有不同。例如,对于 PT_TOUCH
(在 POINTER_TOUCH_INFO
中)有 orientation
和 pressure
,但是 tiltX
、tiltY
、rotation
、和 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可以用。