Windows SendInput заставляет курсор мыши мерцать и исчезать - PullRequest
1 голос
/ 02 июня 2019

Я пишу программу для рабочего стола 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 хочет скрыть курсор, поскольку это обычно происходит происходит, когда пользователь касается экрана.

Есть предложения?

...