Идеи для Windows — объединение ввода мышью и необработанного ввода в одном приложении / окне

Я постараюсь сделать это как можно короче.

У меня есть приложение, которое работало в течение многих лет с одним входом мыши. Я хочу включить возможность для моих пользователей использовать другие формы ввода, такие как интерактивные проекторы, сенсорные устройства или почти все, что предоставляет сообщения WM_INPUT, когда вы регистрируетесь для них.

Общая идея, которая у меня была, заключалась в том, что у меня будет список идентификаторов поставщиков и / или идентификаторов продуктов, которые я буду обрабатывать с помощью необработанного ввода (который предоставляет VID / PID, дескриптор устройства и другую информацию) для каждого полученного сообщения (WM_INPUT). Любые устройства, которые не обрабатываются в исходном коде ввода, будут обрабатываться кодом ввода мыши (WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_RBUTTONDOWN и т. Д.).

В идеале я мог бы оставить весь свой код ввода мыши как есть, или близко к нему. Таким образом, если пользователь подключит две мыши или мышь и неподдерживаемое указательное устройство (то есть мой код ввода Raw не обрабатывает его на основе VID / PID), оба устройства будут использовать один и тот же системный курсор. Любое устройство, известное по моему исходному коду ввода, получило бы отдельные курсоры, которые существуют только в моем приложении.

Проблема проста: ввод с помощью мыши не предоставляет никакой информации об источнике сообщения (например, WM_MOUSEMOVE и т. Д.). Знание о том, что сообщение, исходящее от прикосновения, помогает (я это реализовал), но этого явно недостаточно. Мне нужен какой-то уникальный идентификатор. Если бы я мог знать источник ввода с помощью мыши, я мог бы обрабатывать ввод с помощью мыши только с устройств, которых нет в моем списке известных устройств, и я мог бы обрабатывать только необработанный ввод, который находится в моем списке известных устройств.

К сожалению, я не могу найти способ достичь этого.

Есть идеи?

Спасибо за ваше время извините за длинный пост.

TL; DR — Можете ли вы определить источник ввода мыши (не необработанный ввод) в Windows? Чтобы определить, является ли источник сенсорным, недостаточно информации, мне нужен какой-то уникальный идентификатор.

Ввод мыши — http://msdn.microsoft.com/en-us/library/windows/desktop/ff468877(v=vs.85).aspx

Сырой ввод — http://msdn.microsoft.com/en-us/library/windows/desktop/ms645536(v=vs.85).aspx

1

Решение

Я не знаю ни одного API для получения какого-либо идентификатора устройства после факта.

Вы могли бы использовать тот факт, что WM_INPUT сообщения приходят перед всеми другими входящими сообщениями, и когда вы обрабатываете WM_INPUT вы могли бы использовать GetRawInputDeviceInfo и хэш имени, возвращенного RIDI_DEVICENAME использовать в качестве уникального идентификатора. Или вы можете использовать hDevice член RAWINPUTHEADER состав.

1

Другие решения

edit2: ответ на этот вопрос «Не возможно», вы не можете сделать это. Не пытайтесь, но если вы делаете, и я ошибаюсь, пожалуйста, объясните. В том-то и дело, что вы не можете полагаться на то, что Windows будет последовательно предоставлять сообщения в каком-то определенном порядке, что я и пытался сделать. Это немного меня поразило. Либо используйте необработанный ввод (WM_INPUT), либо используйте сообщения мыши (wm_мышь) не пытайтесь объединить оба как-то.

Я так и не получил ответ, который хотел, но получил что-то, что работает, поэтому я подумал, что стоит поделиться.

Я работаю над огромным предположением, так как не могу найти никакой документации от Windows, чтобы поддержать это предположение (и, вероятно, даже не поверил бы этому, если бы нашел документацию из окон). Насколько я понимаю, когда событие мыши генерируется на самом низком уровне, оно сначала проходит через систему как необработанное входное сообщение (WM_INPUT). После того, как сообщение WM_INPUT опубликовано, ОС получает сообщение и применяет баллистику и все, что она делает до публикации сообщения WM_ * MOUSE *. Большое предположение состоит в том, что этот процесс является последовательным в том смысле, что это всегда 1 сообщение WM_INPUT, за которым следует 1 сообщение WM_ * MOUSE * в очереди.

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

Это позволяет мне использовать n входов в моем приложении независимо.

Я также хотел бы добавить, что согласно предложению Брэндона я использую hDevice член RAWINPUTHEADER структура для уникальной идентификации каждого входа. Поскольку уникальное устройство может иметь несколько входов, мне еще предстоит найти хороший способ уникальной идентификации каждого устройства. VID / PID не работает, потому что вы можете иметь 2 одинаковых устройства с несколькими входами, подключенными к каждому. Я все еще работаю над этим, см. Формат имени устройства Windows HID

Пожалуйста, дайте мне знать, если кто-то хотел бы, чтобы я уточнил!

редактировать: не помечать это как ответ, так как я считаю, что правильный ответ «Не возможно»

0

По вопросам рекламы [email protected]