получить колесо Дельта из wParam в WM MOUSEHWHEEL msg в C#
Я использую глобальные крючки из user32.dll с dllimport в C#. Клавиатура один работает нормально, но события колеса мыши являются проблемой. Это мой обратный вызов события мыши:
private IntPtr MouseInputCallback(
int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode < 0) return CallNextHookEx(mouseHookId, nCode, wParam, lParam);
int eventType = wParam.ToInt32();
if (eventType == WM_MOUSEHWHEEL)
{
int wheelMovement = GetWheelDeltaWParam(eventType);
}
return CallNextHookEx(mouseHookId, nCode, wParam, lParam);
}
Все идет нормально, пока я не должен получить значение WHEEL_DELTA, которое показывает, в какую сторону и сколько прокручивалось колесо. Поскольку в C# отсутствует макрос GET_WHEEL_DELTA_WPARAM , я использую этот код, который должен выполнить эту работу:
Private static int GetWheelDeltaWParam (int wparam) { return
(int)(wparam > > 16);}
Но выход всегда равен 0, что не имеет никакого смысла.
EDIT-result:
MSLLHOOKSTRUCT mouseData = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
int wheelMovement = GetWheelDeltaWParam(mouseData.mouseData);
[StructLayout(LayoutKind.Sequential)]
private struct MSLLHOOKSTRUCT
{
public Point pt;
public int mouseData;
public int flags;
public int time;
public long dwExtraInfo;
}
2 ответов:
Проблема заключается в том, что
GET_WHEEL_DELTA_WPARAMпредназначен для извлечения дельты колеса мыши изwParamaWindowProc, тогда как то, что у вас есть-этоLowLevelMouseProcобратный вызов . В вашем случае ,WParam [in]
Тип: WPARAM
Идентификатор сообщения мыши. Этот параметр может быть одним из следующих сообщений: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN или WM_RBUTTONUP.
The
wParamэто простоWM_MOUSEWHEEL; чтобы получить дельту колеса, вам нужно заглянуть вLParam [in]
Тип: LPARAM
Указатель на объект
MSLLHOOKSTRUCTструктура.И внутри этой структуры,
MouseData
Тип: DWORD
Если сообщение является WM_MOUSEWHEEL, слово высокого порядка этого члена является дельтой колеса. Слово низкого порядка зарезервировано. Позитив значение указывает, что колесо было повернуто вперед, в сторону от то пользователь; отрицательное значение указывает на то, что колесо было повернуто назад., к пользователю. Один щелчок колеса определяется как WHEEL_DELTA, который является 120.
Вы найдете свою ценность.
Пожалуйста, не спрашивайте меня о необходимых деталях C# P/Invoke для работы с этой структурой, так как я почти наверняка ошибусь:)
Здесь вы ищете
WM_MOUSE**H**WHEEL, которое является движением по горизонтали колеса (из стороны в сторону),Не действие прокрутки колеса, которое является
WM_MOUSEWHEEL.if (eventType == WM_MOUSE**H**WHEEL) { int wheelMovement = GetWheelDeltaWParam(eventType); }Вы уверены, что это то, что вы хотите? Может быть, просто заменить
WM_MOUSEWHEELздесь, а также другие предложения.
Comments