Я искал, но большинство постов просто говорят мне, что у меня уже есть, поэтому ниже в основном мой код прямо сейчас:
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 координат мыши, но мне трудно найти что-нибудь подходящее.
Спасибо за любую помощь! 🙂
После обсуждения в комментариях вы должны решить, какой метод лучше всего подходит для вас. К сожалению, никогда не работал с DirectInput, я не знаю все подробности.
Однако оконные сообщения лучше всего подходят для элементов управления в стиле RTS, где курсор выводится на экран. Это связано с тем, что при этом учитываются пользовательские настройки, такие как ускорение мыши и скорость мыши, тогда как DirectInput использует только настройки драйвера (а не настройки панели управления). Пользователь будет ожидать, что мышь будет чувствовать то же самое, особенно в оконном режиме.
DirectInput лучше работает для элементов управления в стиле FPS, когда курсор не нарисован, поскольку сообщения окна дают только координаты курсора, а не значения смещения. Это означает, что, как только вы окажетесь у края экрана, оконные сообщения больше не позволят вам обнаружить дальнейшее перемещение мыши (на самом деле, я не уверен на 100% в этом, поэтому, если кто-то может проверить, пожалуйста, не стесняйтесь комментировать ).
Для клавиатуры я бы определенно предложил оконные сообщения, потому что DirectInput не дает никаких преимуществ, а ввод WM более прост, и довольно мощный (сообщения WM_KEYDOWN содержат много полезных данных), и он позволит вам (через TranslateMessage
) для правильного ввода текста, с учетом региональных настроек и т. д.).
Вы могли бы, вероятно, использовать GetCursorPos с последующим ScreenToClient инициализировать ваш MousePos
состав. Я предполагаю, что вам нужно будет повторять это каждый раз, когда вы теряете ввод мышью и получаете его снова.
Можно было бы использовать гибридное решение для мыши, если вы хотите RTS-подобные элементы управления. Если это так, я предлагаю, хотя я не проверял это, использовать WM для перемещения мыши, что исключает необходимость обходного пути, упомянутого выше, и использовать только DirectInput для обнаружения дополнительных кнопок мыши.
Теперь я думаю, что в таком гибридном подходе вы должны сделать не прямое использование кнопки при обнаружении ее через DirectInput, а скорее опубликовать собственное сообщение приложения в своей собственной очереди сообщений (используя PostMessage
а также WM_APP
) с соответствующей информацией. Я предлагаю это, потому что при использовании WM вы не получаете состояние мыши в режиме реального времени & клавиатура, а точнее состояние на момент сообщения. Публикация сообщения о том, что кнопка была нажата, позволяет вам обрабатывать дополнительные кнопки таким же образом в зависимости от состояния (я не знаю, насколько заметен этот эффект «задержки»). Это также делает всю обработку ввода очень равномерной, так как каждый бит ввода при этом поступает как оконное сообщение.