Как вы перехватываете сообщения WM_GESTURE или WM_TOUCH Windows при написании плагина AutoCAD для стека ObjectARX / C ++ / MF C? - PullRequest
0 голосов
/ 27 января 2020

Я пишу плагин AutoCAD, который использует C ++ с платформой Microsoft Foundation Classes (MF C), и связываю исходную библиотеку ObjectARX, связанную с AutoCAD, которая помогает мне интегрировать мой плагин с собственным кодом AutoCAD.

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

Это пример метода перехвата, который я реализовал ниже. Я могу получать практически все события мыши (щелчок левой кнопкой мыши вниз, щелчок левой кнопкой мыши вверх, колесико мыши, щелчок правой кнопкой мыши, двойной щелчок и т. Д. c.). Проблема заключается в том, что когда я использую свои пальцы на сенсорном экране для выполнения таких жестов, как сжатие и масштабирование или панорамирование двумя пальцами, сообщения Windows не передаются на этот крючок. Я бы предположил, что сообщения WM_GESTURE или WM_TOUCH также были бы перехвачены этим хуком.

Однако окно основного фрейма AutoCAD с рисунком в нем все еще реагирует на эти жестовые действия, которые я выполняю. Т.е. я могу использовать встроенные функции AutoCAD для масштабирования и панорамирования, пока я зажимаю, масштабирую и панорамирую пальцами. Теперь у меня проблема в том, что у меня нет возможности перехватить или изменить эти события жестов в случае, если мне нужно либо заблокировать, либо изменить эту функциональность по умолчанию.

BOOL WindowsMessageHook(MSG *pMsg)
{
  if (pMsg->message == WM_LBUTTONDOWN)
  {
    //Got Left Click (This works!)
  }
  else if (pMsg->message == WM_TOUCH)
  {
    //Try to intercept WM_TOUCH (Doesn't work)
    return TRUE;
  }
  else if (pMsg->message == WM_GESTURE)
  {
    //Try to intercept WM_GESTURE (Doesn't work)
    return TRUE;
  }

  return FALSE;
}

В отдельном вызываемом методе, У меня есть эта строка кода, которая зарегистрирует ловушку с ObjectARX.

acedRegisterFilterWinMsg(WindowsMessageHook);

Я попытался написать некоторый код, который имитирует прозрачное окно для перехвата Windows сообщений (как я видел, предложенный другим, спрашивающим похожие вопросы). К сожалению, по крайней мере из кода, который я пробовал, я все еще не смог перехватить эти типы Windows сообщений (WM_GESTURE / WM_TOUCH).

Теперь мне интересно, есть ли что-то особенное или особенное, что мне нужно сделать для того, чтобы получить эти сообщения. Или, может быть, я просто принципиально не понимаю что-то и иду совершенно неверным путем к решению этой проблемы.

Еще одна потенциальная идея решения, которая пришла мне в голову, заключалась в том, чтобы найти способ переопределить основной кадр AutoCAD "Wnd" (окно) класс и переопределить метод "WndPro c", в частности, как я видел другие подобные предложения в Интернете. Проблема в том, что я не совсем уверен, как go делать это правильно с ObjectARX. Я полагаю, что для получения окна основного фрейма вы используете следующую строчку кода ниже.

CMDIFrameWnd* acadWindowFrame = acedGetAcadFrame();

Примечание: я нацеливаюсь только на Windows 10 машин.

Любое понимание или помощь чрезвычайно Я был очень признателен, когда пытался разобраться с этой проблемой, и в этот момент мне просто кажется, что я зря теряю время.

Большое вам спасибо за ваше время и усилия.

...