C # Перехват для получения событий Raw Mouse / Key - PullRequest
0 голосов
/ 19 декабря 2018

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

У меня уже есть рабочий пример, который использует SetWindowsHookEx () и возвращает низкоуровневые события мыши, такие как WM_MOUSEMOVE, однако структура, которая являетсявозвращенный (MSLLHOOKSTRUCT), по-видимому, недостаточно низкий уровень для того, что я ищу, так как этот пример возвращает экранные координаты X и Y, но вместо этого мне нужно что-то ближе к дельте, чем к «визуализированным» координатам.Из документации кажется, что мне нужны данные RAWMOUSE.Существует много документации о типе данных RAWMOUSE, но не слишком много документации о том, как вы подключаетесь, чтобы получить этот тип сообщения.

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

1 Ответ

0 голосов
/ 19 декабря 2018

Существует много документации о типе данных RAWMOUSE, но не так много документации о том, как вы подключаетесь для получения этого типа сообщения.

Вам нужно использовать RegisterRawInputDevices(), чтобы зарегистрировать мышь, а затем вам нужно обработать сообщение окна WM_INPUT, чтобы получить данные о движении.Для получения дополнительной информации см. Необработанный ввод в MSDN.

Обратите внимание, однако, что вы можете использовать API RawInput только для наблюдения за активностью мыши, но вы не можете заблокировать его с помощью этого API.Вам нужно продолжать использовать SetWindowsHookEx() для этого.Так что ваши крючки должны будут координироваться друг с другом.См. Объединение необработанного ввода и зацепки клавиатуры для выборочного блокирования ввода с нескольких клавиатур в CodeProject, чтобы получить представление о том, как это сделать (используя зацепки мыши вместо зацепок клавиатуры).

Я также собираюсь отслеживать события типа клавиатуры и буфера обмена (для подавления, когда мышь находится за пределами экрана, управляя моей программой)

Вы также можете использовать API-интерфейс RawInput для наблюдения за действиями клавиатуры, простоне блокируйте это.Для этого используйте SetWindowsHookEx().

Что касается событий буфера обмена, вам необходимо использовать AddClipboardFormatListener() (Vista и более поздние версии) или SetClipboardViewer() (XP иранее) для этого.См. Мониторинг содержимого буфера обмена в MSDN для получения более подробной информации.

Однако, это позволяет вам только определять, когда происходят изменения в буфере обмена, но нет способа API блокировать изменения буфера обмена (вы могли быдолжны непосредственно подключать функции SetClipboardData() и OleSetClipboard() в каждом рабочем процессе).

...