Установка / получение моей абсолютной позиции мыши в оконном режиме

Я искал, но большинство постов просто говорят мне, что у меня уже есть, поэтому ниже в основном мой код прямо сейчас:

DIKeyboard->Acquire();
DIMouse->Acquire();

DIMouse->GetDeviceState(sizeof(DIMOUSESTATE), &mouseCurrState);

DIKeyboard->GetDeviceState(sizeof(keyboardState),(LPVOID)&keyboardState);

MousePos.x += mouseCurrState.lX;
MousePos.y += mouseCurrState.lY;

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

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

Спасибо за любую помощь! 🙂

1

Решение

После обсуждения в комментариях вы должны решить, какой метод лучше всего подходит для вас. К сожалению, никогда не работал с DirectInput, я не знаю все подробности.

Однако оконные сообщения лучше всего подходят для элементов управления в стиле RTS, где курсор выводится на экран. Это связано с тем, что при этом учитываются пользовательские настройки, такие как ускорение мыши и скорость мыши, тогда как DirectInput использует только настройки драйвера (а не настройки панели управления). Пользователь будет ожидать, что мышь будет чувствовать то же самое, особенно в оконном режиме.

DirectInput лучше работает для элементов управления в стиле FPS, когда курсор не нарисован, поскольку сообщения окна дают только координаты курсора, а не значения смещения. Это означает, что, как только вы окажетесь у края экрана, оконные сообщения больше не позволят вам обнаружить дальнейшее перемещение мыши (на самом деле, я не уверен на 100% в этом, поэтому, если кто-то может проверить, пожалуйста, не стесняйтесь комментировать ).

Для клавиатуры я бы определенно предложил оконные сообщения, потому что DirectInput не дает никаких преимуществ, а ввод WM более прост, и довольно мощный (сообщения WM_KEYDOWN содержат много полезных данных), и он позволит вам (через TranslateMessage) для правильного ввода текста, с учетом региональных настроек и т. д.).

Решение вашей проблемы с DirectInput:


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

Гибридное решение (для RTS-подобных элементов управления):


Можно было бы использовать гибридное решение для мыши, если вы хотите RTS-подобные элементы управления. Если это так, я предлагаю, хотя я не проверял это, использовать WM для перемещения мыши, что исключает необходимость обходного пути, упомянутого выше, и использовать только DirectInput для обнаружения дополнительных кнопок мыши.

Теперь я думаю, что в таком гибридном подходе вы должны сделать не прямое использование кнопки при обнаружении ее через DirectInput, а скорее опубликовать собственное сообщение приложения в своей собственной очереди сообщений (используя PostMessage а также WM_APP) с соответствующей информацией. Я предлагаю это, потому что при использовании WM вы не получаете состояние мыши в режиме реального времени & клавиатура, а точнее состояние на момент сообщения. Публикация сообщения о том, что кнопка была нажата, позволяет вам обрабатывать дополнительные кнопки таким же образом в зависимости от состояния (я не знаю, насколько заметен этот эффект «задержки»). Это также делает всю обработку ввода очень равномерной, так как каждый бит ввода при этом поступает как оконное сообщение.

0

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


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