Я использую InjectTouchInput()
API в Windows 10 для ввода сенсорных событий из отдельного цифрового планшета. Это хорошо работает (мультитач и т. Д.). Существует довольно много примеров использования API для этого, то есть с использованием типа указателя PT_TOUCH
в том числе один от Microsoft, так что было не слишком сложно настроить их под мои нужды.
Тем не менее, я не нашел ни одного примера использования других типов указателей, особенно PT_PEN
— что мне нужно, когда дигитайзер дает мне ручку ввода. (Я также был бы заинтересован в PT_MOUSE
главным образом, чтобы избежать необходимости использовать SendInput()
или же mouse_event()
.)
Всякий раз, когда я звоню InjectTouchInput()
с PT_PEN
, это не с ERROR_INVALID_PARAMETER
, Я попытался установить несколько комбинаций полей, но ничего (пока) не работает. Документация MSDN не описывает, что делать для PT_PEN
(это не очень много описывает для PT_TOUCH
, но, по крайней мере, есть один образец), так что довольно сложно узнать, какие поля должен быть установленным, какие должен игнорировать любую конкретную последовательность операций и т. д. Я обыскивал сеть, но не смог найти ни одного примера PT_PEN
использовать.
Кто-нибудь имеет пример кода или знает, где его найти, знает, где находится полезная документация, или знает, как InjectTouchInput()
должен быть использован для PT_PEN
(а также PT_MOUSE
)?
Оказывается, что InjectTouchInput()
действительно только для сенсорного ввода — не перо, мышь или общий указатель.
Вы можете сказать, что это очевидно, так как вы передаете массив POINTER_TOUCH_INFO
записи в API, но путаница возникает потому, что документация для POINTER_TOUCH_INFO
(и вся последующая документация) описывает содержание, в основном, как видно из того, кто интерпретирует содержимое, которое ему дают, а не содержимое, которое он пытается установить, а также POINTER_INFO
(первый элемент в POINTER_TOUCH_INFO
) можно указать тип указателя PT_POINTER
, PT_TOUCH
, PT_PEN
, PT_MOUSE
, или же PT_TOUCHPAD
так что это нормально думать «подожди, я могу впрыскивать все эти разные типы указателей!«
Конечно, все типы указателей, несмотря на наличие POINTER_INFO
в общем, принимает несколько другие параметры. Например, есть orientation
а также pressure
за PT_TOUCH
(в POINTER_TOUCH_INFO
), но 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 года это упоминание о том, чтонет API для инъекций пера«, и с тех пор ситуация не улучшилась, поэтому драйвер для инъекции пера по-прежнему требуется. При этом API автоматизации пользовательского интерфейса Windows, по-видимому, может вводить все типы указателей (и игровую панель для загрузки), но это поддерживается только с Windows 10 Anniversary Edition (и я еще не пробовал).
Мы можем реализовать ввод с помощью пера InputInjector.InjectPenInput
И в win32 нет публичного API для инъекций пера. Если ваша система Windows 10, версия 1809, InjectSyntheticPointerInput может быть использован.