Я пишу программу для рабочего стола Windows на C ++, которая использует весь ввод с сенсорного экрана, заменяя ее на ввод с помощью мыши, созданный с помощью SendInput. Пока что я просто хочу, чтобы любое движение, сделанное пальцем на сенсорном экране, было отправлено как дельта мыши. Я, например, должен иметь возможность использовать физическую мышь, чтобы поместить курсор в верхнюю часть экрана, затем перетащить палец по горизонтальной линии вдоль нижней части экрана и увидеть, как курсор повторяет это движение выше.
Это работает, кроме трех выпусков;
- Пока я двигаю пальцем, курсор быстро мерцает между обычным значком мыши и значком с колесом прогресса.
- Когда я убираю палец, курсор переходит на последнюю позицию моего пальца, хотя, если я снова касаюсь экрана, он возвращается назад.
- Если я продолжу держать палец на экране, курсор полностью исчезнет (его можно расположить под моим пальцем, но я, очевидно, там не вижу)
Немного подробнее о том, что я делаю;
Я использую CreateWindowEx, чтобы создать невидимое окно только для сообщений.
Затем я использую RegisterPointerInputTarget, чтобы гарантировать, что весь сенсорный ввод отправляется в мое окно.
В моей функции WndProc я возвращаю 0 без вызова DefWindowProc для всех сообщений WM_POINTERENTER, WM_POINTERLEAVE, WM_POINTERUP, WM_POINTERDOWN, WM_POINTERUPDATE, WM_POINTERCAPTURECHANGED и WM_TOUCH.
Я использую WM_POINTERDOWN для обнаружения новых касаний, WM_POINTERUPDATE для отправки соответствующих обновлений мыши с помощью SENDINPUT и WM_POINTERUP / WM_POINTERCAPTURECHANGED, чтобы остановить отслеживание касания.
******* ******** EDIT 1023. *
Теперь у меня есть исправление исчезновения курсора, когда пользователь убирает палец с экрана; отправить два движения мыши из сообщения WM_POINTERUP. Я на самом деле не хочу, чтобы курсор двигался вообще, поэтому я посылаю одно движение (1, 0), а затем одно из (-1, 0). Это похоже на взлом, я уверен, что так, если у кого-то есть лучшее предложение, пожалуйста, дайте мне знать.
Чтобы исправить исчезновение мыши, когда палец все еще остается на экране, мне пришлось сделать то же самое в сообщении WM_POINTERUPDATE; разделите каждое движение, которое я отправлю оттуда, на два сообщения. Я также должен был убедиться, что отправляю движение для каждого полученного WM_POINTERUPDATE (я пропускал пустые).
Это только оставляет проблему мерцания мыши. Это можно воспроизвести гораздо проще. Просто используйте Visual Studio для создания нового приложения Windows для рабочего стола и добавьте этот код в функцию WndProc;
case WM_POINTERUPDATE:
{
INPUT Inputs[1] = { 0 };
Inputs[0].type = INPUT_MOUSE;
Inputs[0].mi.dx = 1;
Inputs[0].mi.dy = 0;
Inputs[0].mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, Inputs, sizeof(INPUT));
}
Запустите программу, коснитесь экрана внутри окна приложения, и произойдет мерцание. Это происходит только в том случае, если вызовы SendInput выполняются из WM_POINTERUDPATE, поэтому я подозреваю, что проблема связана с тем, что Windows хочет скрыть курсор, поскольку это обычно происходит происходит, когда пользователь касается экрана.
Есть предложения?