get wheel delta wparam

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

Окно получает это сообщение через посредство своей функции WindowProc.

Старшее слово указывает интервал, на который прокрутилось колесико, выраженный в нескольких или раздельных WHEEL_DELTA , число которых — 120. Положительное значение указывает, что колесико вращалось вперед, в сторону от пользователя; отрицательное значение указывает, что колесико вращалось назад, к пользователю.

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

Значение Предназначение
MK_CONTROL Клавиша CTRL находится в нажатом состоянии.
MK_LBUTTON Левая кнопка мыши находится в нажатом состоянии.
MK_MBUTTON Средняя кнопка мыши находится в нажатом состоянии.
MK_RBUTTON Правая кнопка мыши находится в нажатом состоянии.
MK_SHIFT Клавиша SHIFT находится в нажатом состоянии.
MK_XBUTTON1 Windows 2000/XP: Первая X-кнопка находится в нажатом состоянии.
MK_XBUTTON2 Windows 2000/XP: Вторая X-кнопка находится в нажатом состоянии.

Младшее слово устанавливает x-координату указателя, относительно левого верхнего угла экрана.

Старшее слово устанавливает y-координату указателя, относительно левого верхнего угла экрана.

Если приложение обрабатывает это сообщение, оно должно возвратить нуль.

Используйте ниже код, чтобы получить информацию в параметре wParam:

Используйте нижеследующий код, чтобы получить горизонтальную и вертикальную позицию:

Вы можете также использовать и макрос MAKEPOINTS, чтобы преобразовать параметр lParam в структуру POINTS.

Вращение колесика должно быть кратным WHEEL_DELTA , число которых устанавливается 120. Это — пороговая величина для охватываемых действий, а одно такое действие (например, единичное увеличение прокрутки) должно происходить для каждой дельты.

Дельта была определена как 120, чтобы дать возможность Microsoft или другим продавцам создавать колесики с более высокой разрешающей способностью в будущем, включая возможность свободно вращающегося колесика без меток. Ожидается, что такое устройство будет отправлять больше сообщений при вращении, но с меньшей величиной дельта в каждом сообщении. Чтобы поддержать этот вариант, вы должны или добавлять поступающие значения дельта, пока WHEEL_DELTA не достигнет предела (так для дельта-прокрутки Вы получаете одно и то же ответное действие), или прокручиваете для просмотра часть строк в ответ на более частые сообщения. Вы можете также выбрать свою гранулярность (степень дробления) прокрутки и копить единицы дельта, пока параметр не достигнет предела.

Windows 95, Windows NT 3.51: Поддержка колесика мыши обеспечивается через посредство отдельно запускаемого модуля MSWheel , который создает сообщение MSH_MOUSEWHEEL. Модуль MSWheel , который состоит из MSWheel.exe и MSWheel.dll, устанавливается с программой IntelliPoint, которая поставляется с устройством управления позицией IntelliMouse (Разумной мышью) ®. Кроме того, MSH_MOUSEWHEEL определяется в заголовочном файле (ZMouse.h), который приложение должно использовать, чтобы осуществить поддержку колесику через модуль MSWheel .

Обратите внимание! на то, что, для MSH_MOUSEWHEEL нет fwKeys. В противном случае, параметры являются точно теми же, что и для WM_MOUSEWHEEL.

При отпуске кнопки приложение переадресует MSH_MOUSEWHEEL любому внедренному объекту или органу управления. Приложение обязано отправлять сообщение активной программе с внедренной технологией OLE. Это дополнение, которое прикладная программа отправляет, дает возможность функционировать колесику в органе управления с фокусом. Если приложение отправляет сообщение органу управления, оно может проверить возвращаемое значение, чтобы видеть, было ли сообщение обработано. Органы управления обязаны возвращать значение ИСТИНА (TRUE), если они обрабатывают сообщение.

Размещение и совместимость WM_MOUSEWHEEL

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

Также эта страница Вот означает, что поворот колеса вперед дает положительное число, а назад — отрицательное, тогда как эта страница Вот указывает на то, что оно направо и налево, а не вперед и назад.

Вот полный обработчик сообщений:

Решение

Вы передаете LPARAM в GET_WHEEL_DELTA_WPARAM , Вы должны проходить WPARAM ( Addtl_Info_W не Addtl_Info_L ).

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

Вы должны показать весь цикл обработки сообщений или, по крайней мере, там, где определено «Addtl_Info_L», потому что это должен быть wParam «win32msg-> wParam».

Возможно, вы преобразовали короткое значение в unsigned int или вывели короткое значение, используя строку формата без знака в ваших тестах? Вы можете проверить наличие негатива, используя условные выражения, чтобы убедиться.

How would I go about using the GET_WHEEL_DELTA_WPARAM macro in C#?

3 Answers 3

High-order word, signed:

For maximum clarity, I would define a set of functions like this:

And then use the function like so, where wParam is the WPARAM parameter you get from handling the Win32 WM_MOUSEWHEEL or WM_MOUSEHWHEEL messages:

You might need to suppress overflow-checking in order for this to work properly. To do so, either change your project settings, or wrap the relevant conversion functions in an unchecked block.

Оцените статью