Как ввести перьевой ввод из дигитайзера с помощью InjectTouchInput () с PT_PEN в Windows 10

Я использую 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)?

1

Решение

Оказывается, что 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_TOUCHPOINTER_TOUCH_INFO), но tiltX, tiltY, rotation, а также pressure за PT_PENPOINTER_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 (и я еще не пробовал).

1

Другие решения

Мы можем реализовать ввод с помощью пера InputInjector.InjectPenInput

И в win32 нет публичного API для инъекций пера. Если ваша система Windows 10, версия 1809, InjectSyntheticPointerInput может быть использован.

0

По вопросам рекламы [email protected]