Можно ли перехватить события мультитач в Win7, преобразовать их в события мыши и клавиатуры и отправить в другое приложение? - PullRequest
1 голос
/ 29 июля 2010

У меня следующая ситуация: у меня есть специальная 3D-программа, которая мне нужна, чтобы можно было реагировать на события с несколькими касаниями, не меняя саму программу. Поэтому мне нужна программа mapper, которая получает события мультитач в Windows 7, преобразует их в соответствующие события мыши и клавиатуры и отправляет эти эмулированные события в 3D-программу, чтобы она могла обрабатывать эти события.

Я уже много читал и пробовал, и мой нынешний подход - иметь почти прозрачное окно наложения поверх 3D-программы для захвата событий мультитач. Но это также проблема, я не могу перенаправить сгенерированные события мыши в основную 3D-программу удобным для использования способом. Прямо сейчас я использовал функции pinvoke, такие как mouse_event, SendMessage и так далее, но ни одна из них не работала для меня. Так как мне всегда приходилось выводить 3D-программу на передний план, отправлять событие, а после этого мне нужно было снова выводить мою программу картографирования на передний план. Это работает довольно дерьмово.

Итак, мой вопрос более или менее, есть ли хороший рабочий подход для выполнения вещей, которые я упомянул выше? Или хотя бы хороший способ отправки событий мыши и клавиатуры процессам в фоновом режиме?

Надеюсь, кто-нибудь может дать мне подсказку или предложение ....

Вот как я сейчас симулирую щелчки мыши:

</p> <pre><code> private void OnMouseDown(object sender, MouseEventArgs e) { Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); //Simulate the mouse event on the given position this.Visible = false; Cursor.Position = position; mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); } private void OnMouseUp(object sender, MouseEventArgs e) { Point position = this.PointToScreen(new Point(e.Location.X, e.Location.Y)); //Simulate the mouse event on the given position Cursor.Position = e.Location; mouse_event(Convert.ToUInt16(MouseEventFlags.LEFTUP), 0, 0, 0, 0); this.Visible = true; } //Get a handle to the mouse event manager [DllImport("user32.dll")] private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint dwData, int dwExtraInfo);

Ответы [ 2 ]

0 голосов
/ 17 августа 2010

В Win32 нет способа направить события мыши / клавиатуры на определенный процесс.При этом, однако, вы могли бы быть в состоянии заставить этот подход работать:

  1. Зарегистрируйте окно сопоставления в качестве сенсорного окна для получения событий касания.
  2. Добавьте обработчик для WM_NCHITTEST в цикл обработки сообщений, вызовите DefWindowProc (), чтобы получить обработчик по умолчанию, а затем преобразуйте все возвраты HTCLIENT в HTTRANSPARENT.Это заставит Windows передавать любые события мыши через ваше окно в основное окно.
  3. Это, вероятно, не сработает, если ваше окно сопоставления находится в отдельном процессе от вашей клиентской программы;если это так, вам придется взломать AttachThreadInput .Между прочим, я не рекомендую это делать, поскольку объединенные очереди потоков очень подвержены ошибкам.
0 голосов
/ 02 августа 2010

возможно взгляните на InfoStrat.VE - Bing Maps 3D для WPF и Microsoft Surface . Они сделали управление картами Bind доступным для касания.

Может быть, это помогает.

...