Несколько необработанных входных оконных раковин - PullRequest
5 голосов
/ 14 марта 2012

У меня есть окно только для сообщений (ATL :: CWindowImpl), которое регистрируется для необработанного ввода с использованием флага RIDEV_INPUTSINK, что означает, что он получает весь ввод независимо от того, является ли окно окном переднего плана. Это прекрасно работает, когда есть только один экземпляр этого окна.

Однако, когда я создаю более 1 экземпляра моего окна, только одно получает сообщения WM_INPUT (в настоящее время я создаю два, и только второй, который будет создан, получает сообщения).

RegisterRawInputDevices (используя RIDEV_INPUTSINK | RIDEV_NOLEGACY) успешно выполняется при создании обоих окон. Кроме того, окно, не получающее необработанный ввод, все еще получает другие сообщения, так что это не проблема с самим окном ...

Если это актуально, я использую бета-версию VC11, и создаются окна, которые отправляют сообщения в разные потоки (используя std :: thread).

Это ограничение API (т. Е. Вы ограничены одним входным приемником на процесс)? Или есть способ заставить это работать?

Заранее спасибо.

EDIT:

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

1 Ответ

5 голосов
/ 18 марта 2012

Из MSDN ( здесь и здесь ) весь API для Raw Input всегда говорит о приложении, а не об окне ... что означает, что приложение, регистрирующееся для необработанного ввода, будет ОС воспринимается как одно право ... что вы косвенно доказали, зарегистрировав второе получающее winow - первое просто перестало получать, потому что ОС доставляет необработанный ввод в приложение (представленный в виде окна только в виде окна).

...