7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
|
|
1 | |
Функция WinAPI для получения данных о вращении колёсика мыши10.08.2018, 11:19. Показов 5083. Ответов 21
Народ, кто-нибудь знает функцию виндовского апи, которая позволяла бы получить данные о вращении колёсика мыши, не прибегая к сообщениям процедуры окна?
Для получения координат курсора можно использовать функцию GetCursorPos, для нажатия кнопок используем функцию GetKeyState, а для колёсика мыши всё никак не могу найти ничего, ни на MSDN, ни в остальном интернете.
1
|
10.08.2018, 11:19 | |
Ответы с готовыми решениями:
21
Функция для получения данных из закрытого файла Использование колесика мыши для открытия папок в новом окне? Функции WinApi для получения системной информации Управление с колёсика мыши |
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
|
|
10.08.2018, 12:25 | 2 |
Думаю, такого API быть принципе не может, так как нет фактически объекта, которым управляет колесико. Сообщение WM_MOUSWHEL происходит если колесико мыши было повернуто на определенное количество градусов, но оно не перемещает курсор мыши или не изменяет состояние другого объекта, не требующего какого-нибудь участия программиста, разрабатывающего прикладное приложение.
Конечно, можно создать такой объект, но для этого придется писать для него свой драйвер. Вопрос, а нужен ли такой объект или нет. Если у вас возник подобный вопрос, то ставьте задачу шире. Хотя бы укажите, для какой цели вам нужны эти данные. Возможно, вам подскажут альтернативные решения задачи. Сейчас для этого нет никакой информации
0
|
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
|
|
10.08.2018, 15:21 [ТС] | 3 |
Спасибо, что ответили.
Мне это нужно для следующей цели. Дело в том, что я создаю собственный класс для мыши. Этот класс при вызове метода Update обновит в своих переменных координаты курсора, состояние кнопок и ситуацию с колёсиком, в результате чего после можно будет при помощи определённых методов и доступа к определённым переменным получить интересующие нас во время процесса игры данные о мыши. Имейте ввиду, что у меня также есть отдельный класс для окон, и окон в теории может быть несколько одновременно. Поэтому для получения координат курсора относительно левого-верхнего угла окна в метод класса мыши будет передаваться указатель на класс окна. Работаю в C++ с OpenGL. А вот начинал работать когда-то давно с XNA на C#, так вот там вроде бы класс мыши умел сам как-то получать данные о колёсике мыши, наравне со всем остальным. Да ещё, я конечно не знаю, потому что не работал с этими вещами, но glut и SFML также вроде бы предоставляют данные о колёсике мыши без доступа к процедуре окна.
0
|
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
|
|
10.08.2018, 17:16 | 4 |
Как я понял, при вращении колесика мышки ваш игровой объект будет совершать некоторые действия. При этом, учтите будет активно окно вашей программы. Так не лучше напрямую задействовать сообщение WM_MOUSEWHEL без всяких там классов.
Я пишу программы на С++ и ассемблере и пришел к выводу, что классы нужны лишь для удобства программиста, за что программа расплачивается снижением своего быстродействия и завышенными минимальными ресурсами, которые покрывают необоснованная мощь современных компьютеров, о возможностях которых мы даже не догадываемся. А некоторые программисты за этим прячут свое неумение писать оптимальный код для решения своих задач Вы извините меня. Это были мысли в слух
0
|
10.08.2018, 17:34 | 5 |
SunFox25,
посмотрите Типичное мнение писателя на ассемблере и вообще любого ярого фаната какой-то идеи. Не зацикливайтесь. Мир многогранен, и с такой точки зрения вы многого не увидите.
0
|
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
|
|
10.08.2018, 18:05 | 6 |
Я не ярый сторонник ассемблера. Большинство своих программ написал на С++ WinAPI+STL. Иногда, даже пишу классы, где это обосновано. Но, по-моему, сейчас большинство программистов придерживается другой крайности, объектно-ориентированного программирования, что тоже не совсем верно.
0
|
10.08.2018, 18:22 | 7 |
Низкий уровень: при больших затратах труда даёт приложения малого размера и высокой производительности (если руки прямые).
Высокий уровень: при малых затратах труда получается меньшая производительность с бОльшим размером файлов. Количество затраченного труда имеет прямое отношение к деньгам и времени. Производительность тоже влияет. Но в гораздо более узких областях. Потому сокращение затрат труда чаще всего важнее. Это не крайность, а следствие развития технологий и конкуренции.
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
|
10.08.2018, 18:52 | 8 |
Можно посмотреть в направлении DirectInput
0
|
19 / 10 / 5
Регистрация: 07.06.2018
Сообщений: 63
|
|
10.08.2018, 21:45 | 9 |
И что мы в результате этого имеем. Нам приходится писать программы, которые будут работать на довольно глючной операционной системы MS Windows, так как она установлена у большинства пользователей. Вспомни какой процент операционок этой линейки работало нормально. А все почему? Потому, что программисты работают за деньги. Им лучше лишнюю таблетку написать и получить лишнюю зарплату, чем досконально проверить свой код, но задержать продукт на год. А все ли мы используем возможности последних операционных систем этой линейки. Знаю по себе, нет. Мои программы вполне могли работать на MS Windows Vista, а некоторые даже на ХР. И я не уверен, что производительность моих программ на этих системах была бы ниже, чем на Windows 10.
0
|
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,939
|
|
10.08.2018, 23:57 | 11 |
А шаблонами функций/классов ещё не пользовались? Или задач, связанных с однотипным поведением разных типов данных ещё не было?
в плане применения std::vector или всё же шире?
0
|
11.08.2018, 00:54 | 12 |
оптимизация это всё круто конечно, но с чего ты решил, что знаешь ассемблер и приёмы оптимизации на нём лучше, чем профессиональные разработчики компиляторов?
Более того, я просто представить не могу задач, применяющих ООП на С++, которые прям "отжирают ресурсы". Ну не нравится тебе, что у объекта лишние 4 байта тратятся на таблицу вирт.функций, например? Ну не используй виртуальность... какой-бы ты велосипед ни написал ей на замену, уверен он не будет оптимальнее. Или какой ужас творит ООП? одна лишняя инструкция push this или mov this при вызове методов инкапсулированных в объект? Неявный вызов конструкторов и деструкторов? Опять же, там где они не нужны, их нет, там где нужны - попробуй переплюнуть компилятор со своим велосипедом. Единственный момент связан не с ООП как таковым, а со стандартной библиотекой С++, работа которой медленнее сишны чисто функций.
0
|
1467 / 1008 / 456
Регистрация: 30.10.2017
Сообщений: 2,798
|
|
11.08.2018, 00:59 | 13 |
0
|
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
|
||||||
11.08.2018, 14:01 [ТС] | 14 | |||||
Попробовал следующее.
В классе мыши:
Есть какие-нибудь светлые идеи по этому поводу? Mouse.Update() при этом пробовал ставить и перед основным PeekMessage (тем который с PM_REMOVE) и после, результат один и тот же. Почему мой мышиный PeekMessage отлавливает сообщение WM_MOUSEWHEEL не всегда? Я думал он не только в сию секунду появившееся сообщение отлавливает, а выполняет поиск по всем накопившимся сообщениям. А ещё я где-то краем глаза что-то видел про какие-то хуки - якобы для отлова сообщений Windows. Что это такое и для чего нцжно, как использовать не знаю, может это может как-то помочь? Буду признателен за помощь.
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
||||||
12.08.2018, 01:02 | 15 | |||||
Простой пример использования трёх вариантов: обычные сообщения, directinput, rawinput (отключен, но можно раскомментировать)
2
|
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
|
|
12.08.2018, 22:01 [ТС] | 16 |
Спасибо конечно про DirectInput, но я использую OpenGL и мне подключать ещё и DirectX как-то не хочеться.
А как получить данные о колёсике мыши в процедуре окна я и без вас знаю, хватит уже писать. У меня раньше был класс мыши, которому значение вращения колёсика задавать приходилось вручную как раз таки в процедуре окна. Но теперь я сделал отдельный класс для окон, и единственная возможность отлавливать WM_MOUSEWHEEL это передать указатель на класс мыши в какой-нибудь класс окна (процедура окна находиться внутри класса). Но это как-то не профессионально и не удобно. Есть какие-нибудь идеи почему приведённый мною выше код не работает?
0
|
12.08.2018, 22:23 | 17 |
Сообщение было отмечено SunFox25 как решение
Решение
С чего бы это? наоборот ООП в чистом виде! При инициализации объект класса регистрируется в WNDproc'е и специально для дёрганья из оттуда создаётся метод setWheel (а впрочем и не только wheel) А уже все пользователи класса переспрашивают эту инфу методом GertWheel
0
|
7 / 6 / 2
Регистрация: 09.08.2018
Сообщений: 27
|
||||||
13.08.2018, 11:25 [ТС] | 18 | |||||
Спасибо, Кузя Домовёнок, разрешили мою проблему моим же решением. Наверное сделаю как и сказал.
Но всё же ради интереса, почему вот этот вот код не работает?
0
|
2376 / 834 / 317
Регистрация: 10.02.2018
Сообщений: 1,968
|
|
13.08.2018, 13:13 | 19 |
PeekMessage просматривает только те сообщения, которые лежат в очереди. Если есть ещё один код, который достаёт сообщения из очереди, то, очевидно, что они могут мешать друг другу.
0
|
0 / 0 / 0
Регистрация: 12.12.2018
Сообщений: 3
|
|
18.12.2018, 03:52 | 20 |
Ygg, здравствуй, понимаю , что прошло много времени, но я очень тебя прошу помоги.
ты писал код выше, он работает все круто, но как сильно упростить этот код? мне например не нужно чтобы создавалось окно программы, достаточно обычной консоли. мне нужно чтобы была переменная которая менялась в зависимости от вращения колеса и все а дальше я уже сам буду с этой переменной работать
0
|
18.12.2018, 03:52 | |
18.12.2018, 03:52 | |
Помогаю со студенческими работами здесь
20
Событие колесика мыши Имитация колёсика мыши Написать программу для получения сведений о системе, используя WinAPI функции Имитация прокрутки колесика мыши Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |