RegisterPointerInputTarget не использует весь ввод - PullRequest
0 голосов
/ 22 мая 2019

Я работаю в Windows 10 и пытаюсь написать программу на C ++, которая перехватывает весь ввод данных с сенсорного экрана, однако некоторые данные все еще проходят.

Мой код вызывает RegisterPointerInputTarget с PT_TOUCH для перехвата сенсорного ввода. Это в основном работает, но результаты противоречивы. В качестве теста я добавил код, который использует SendInput для медленного перемещения мыши вправо при обнаружении сенсорного ввода. При работающей программе я могу, например, открыть MS Paint и коснуться экрана. Пока я держу палец на курсоре, он медленно перемещается вправо, как и ожидалось. Однако в тот момент, когда я двигаю пальцем, курсор переходит в положение под моим пальцем, как если бы моя программа вообще не работала.

Чтобы привести другой пример, если я попробую то же самое в Visual Studio, снова курсор медленно перемещается вправо, пока я не переместлю палец, и в этот момент курсор следует за движением моих пальцев, но медленно, отставая от него с значительная задержка

Код для настройки моего окна выглядит так:

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   hInst = hInstance; // Store instance handle in our global variable
   static const char* class_name = "DUMMY_CLASS";
   WNDCLASSEX wx = {};
   wx.cbSize = sizeof(WNDCLASSEX);
   wx.lpfnWndProc = WndProc;        // function which will handle messages
   wx.hInstance = hInst;
   wx.lpszClassName = class_name;
   HWND hWnd = 0;
   if (RegisterClassEx(&wx)) {
       hWnd = CreateWindowEx(0, class_name, "dummy_name", 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
   }

   if (!hWnd)
   {
      return FALSE;
   }

   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);

   if (RegisterTouchWindow(hWnd, 0) &&
       RegisterPointerInputTarget(hWnd, PT_TOUCH))
   {
     ...

и мой код обработки сообщений выглядит так:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_TOUCH:
    {
        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));

В идеале этот тестовый код будет просто перемещать курсор для любого сенсорного ввода. Буду очень признателен за любую помощь в исправлении или просто понимание этого!

1 Ответ

0 голосов
/ 02 июня 2019

Я достиг некоторого прогресса в этом, но столкнулся с другими, связанными, проблемами, о которых я спрошу в отдельном вопросе.Я добавлю комментарий здесь, когда этот вопрос живой.Ключом к решению этой первоначальной проблемы, однако, было убедиться, что я возвращаю 0, не вызывая DefWindowProc из всех сообщений WM_POINTERENTER, WM_POINTERLEAVE, WM_POINTERUP, WM_POINTERDOWN, WM_POINTERUPDATE и WM_TOUCH, и вставив мой вызов SendInput_ в код, обрабатывающий код.

...