Получение положения мыши, не ограниченного размером экрана, С++ и окнами

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

В настоящее время я использую функцию GetCursorPos(), которая является простой и достаточно быстрой, но я сталкиваюсь с проблемой, что все данные обрезаются на основе текущего разрешения экрана 1920x1600, так что все значения x находятся в диапазоне от 0 до 1920. и все значения y находятся в диапазоне от 0 до 1600, независимо от того, насколько далеко физически перемещается мышь.

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

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

Я работаю в среде Windows, и смена языка невозможна.


person Community    schedule 10.08.2009    source источник
comment
Я не знаю, но я полагаю, вам нужно написать какой-то драйвер устройства, чтобы получить эту информацию.   -  person 1800 INFORMATION    schedule 11.08.2009


Ответы (3)


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

Вот другая релевантная ссылка.

person amado    schedule 11.08.2009
comment
В старые недобрые времена DOS и мышей с последовательным интерфейсом я просто открывал последовательный порт для мыши и получал протокол для подобных задач. Но повторное центрирование мыши (другие ответы), вероятно, является лучшим методом. - person Matthias Wandel; 11.08.2009

Я могу ошибаться, но в среде Win32 вы не получаете сообщений о перемещении мыши, когда мышь находится на краю экрана, потому что мышь не движется. Обычный способ получить бесконечную область мыши — сделать следующее:

  1. Спрячьте мышь, получите эксклюзивный доступ и запишите положение
  2. Центр мыши в окне
  3. Когда мышь движется, получить дельту от центра экрана до текущей позиции
  4. Центр мыши в окне снова
  5. Следующее движение мыши должно иметь дельту (0,0), поэтому игнорируйте его.
  6. Перейти к 3 до конца операции перемещения мыши
  7. Сбросить позицию, показать мышь и разблокировать монопольный доступ

Если бы вы не спрятали мышь, вы бы увидели, как мышь перемещается на небольшое расстояние, а затем возвращается в центральное положение, что выглядит неприятно.

Этот метод требует перекачки сообщений для сообщений о перемещении мыши, поэтому идея консольного приложения, вероятно, не будет работать с этим. Можете ли вы создать полноэкранное невидимое окно для захвата мыши?

person Skizz    schedule 11.08.2009
comment
Ничто не мешает консольной программе иметь насос сообщений или создавать окна. Но наличие самой консоли было бы довольно бессмысленным, поскольку похоже, что эта программа не должна иметь ввода или вывода текста. - person Rob Kennedy; 11.08.2009
comment
Вы можете просто использовать GetCursorPos/SetCursorPos в цикле (с Sleeps между ними), чтобы получить тот же эффект. Не бесшовное решение, но, вероятно, будет работать. - person Nick; 11.08.2009

Просто получите позицию, и переместите ее в центр и сами верните дельту

Вот как это делают FPS-игры

person Pyrolistical    schedule 11.08.2009