Поделиться через


Функция InjectTouchInput (winuser.h)

Имитирует сенсорный ввод.

Примечание. InitializeTouchInjection должен предшествовать любому вызову Метода InjectTouchInput.

 

Синтаксис

BOOL InjectTouchInput(
  [in] UINT32                   count,
  [in] const POINTER_TOUCH_INFO *contacts
);

Параметры

[in] count

Размер массива в контактах.

Максимальное значение count задается параметром maxCount функции InitializeTouchInjection .

[in] contacts

Массив структур POINTER_TOUCH_INFO , представляющих все контакты на рабочем столе. Экранные координаты каждого контакта должны находиться в пределах рабочего стола.

Возвращаемое значение

Если функция выполняется успешно, возвращаемое значение не равно нулю.

Если функция выполняется неудачно, возвращается нулевое значение. Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Внедренные входные данные отправляются на рабочий стол сеанса, в котором выполняется процесс внедрения.

Существует два состояния ввода для внедрения сенсорного ввода (интерактивное и наведение), которые указываются следующими сочетаниями pointerFlags в контактах:

pointerFlags (POINTER_FLAG_*) Состояние
INRANGE | ОБНОВЛЕНИЕ Запуск или перемещение сенсорного наведения
INRANGE | INCONTACT | ВНИЗ Сенсорный контакт вниз
INRANGE | INCONTACT | ОБНОВЛЕНИЕ Сенсорный контакт перемещается
INRANGE | UP Сенсорный контакт вверх и переход на наведение
UPDATE Сенсорный наведение заканчивается
UP Концы касания
 
Примечание Интерактивное состояние представляет сенсорный контакт, который находится на экране и может взаимодействовать с любым приложением с поддержкой сенсорного ввода. Состояние при наведении курсора представляет собой сенсорный ввод, который не соприкасается с экраном и не может взаимодействовать с приложениями. Внедрение сенсорного ввода может начинаться при наведении или интерактивном состоянии, но состояние может переходить только через INRANGE | INCONTACT | DOWN для перехода в интерактивное состояние или через INRANGE | UP для интерактивного перехода на состояние наведенного указателя мыши.
 
Все последовательности внедрения касания заканчиваются обновлением или up.

На следующей схеме показана последовательность внедрения сенсорного ввода, которая начинается с состояния наведении, переходит в интерактивный режим и завершается наведением.

Схема последовательности внедрения сенсорного ввода, показывающая переходы состояния от наведении на интерактивный.

Для жестов нажатия и удержания необходимо отправить несколько кадров, чтобы гарантировать, что входные данные не будут отменены. Для нажатия и удержания в точке (x,y) отправьте WM_POINTERDOWN в точке (x,y), а затем WM_POINTERUPDATE сообщения в точке (x,y).

Прослушивание WM_DISPLAYCHANGE для обработки изменений разрешения и ориентации экрана, а также управления обновлениями координат экрана. Все активные контакты отменяются при получении WM_DISPLAYCHANGE .

Отмена отдельных контактов путем установки POINTER_FLAG_CANCELED с помощью POINTER_FLAG_UP или POINTER_FLAG_UPDATE. Отмена внедрения сенсорного ввода без POINTER_FLAG_UP или POINTER_FLAG_UPDATE делает внедрение недействительным.

Если задано POINTER_FLAG_UP, значение ptPixelLocation POINTER_INFO должно совпадать со значением предыдущего кадра сенсорного ввода с POINTER_FLAG_UPDATE. В противном случае внедрение завершается сбоем с ERROR_INVALID_PARAMETER и отменяются все активные контакты внедрения. Система изменяет ptPixelLocation события WM_POINTERUP при отмене внедрения.

Входную метку времени можно указать в поле dwTime или PerformanceCount POINTER_INFO. Значение не может быть более поздним, чем текущее число тактов или значение QueryPerformanceCounter потока внедрения. После внедрения кадра с меткой времени все последующие кадры должны включать метку времени, пока все контакты в кадре не перейдут в состояние UP. Для первого элемента в массиве контактов необходимо указать настраиваемое значение метки времени. Значения меток времени после первого элемента игнорируются. Значение настраиваемой метки времени должно увеличиваться в каждом кадре внедрения.

Если указано поле PerformanceCount, метка времени преобразуется в текущее время в разрешении 0,1 миллисекунда после фактического внедрения. Если пользовательский PerformanceCount привел к тому же окну в 0,1 миллисекунда из предыдущего внедрения, API вернет ошибку (ERROR_NOT_READY) и не будет внедрять данные. Хотя внедрение не сразу становится недействительным из-за ошибки, следующее успешное внедрение должно иметь значение PerformanceCount, которое составляет не менее 0,1 миллисекунда от ранее успешного внедрения. Точно так же настраиваемое значение dwTime должно быть не менее 1 миллисекунды, если использовалось поле.

Если в параметре внедрения указаны как dwTime, так и PerformanceCount, то сбой InjectTouchInput с кодом ошибки (ERROR_INVALID_PARAMETER). После запуска приложения внедрения с параметром dwTime или PerformanceCount поле метки времени должно быть заполнено правильно. Внедрение не может переключить настраиваемое поле метки времени с одного на другое после запуска последовательности внедрения.

Если значения dwTime и PerformanceCount не указаны, элемент InjectTouchInput выделяет метку времени на основе времени вызова API. Если количество вызовов меньше 0,1 миллисекунда, API может вернуть ошибку (ERROR_NOT_READY). Ошибка не приведет к немедленной отмене входных данных, но приложению внедрения необходимо повторить попытку того же кадра, чтобы обеспечить успешное внедрение.

Требования

   
Минимальная версия клиента Windows 8 [только классические приложения]
Минимальная версия сервера Windows Server 2012 [только классические приложения]
Целевая платформа Windows
Header winuser.h
Библиотека User32.lib
DLL User32.dll
Набор API ext-ms-win-rtcore-ntuser-wmpointer-l1-1-0 (представлено в Windows 10, версия 10.0.14393)

См. также

Функции