получить колесо Дельта из 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;
}
895   2  

2 ответов:

Проблема заключается в том, что GET_WHEEL_DELTA_WPARAM предназначен для извлечения дельты колеса мыши из wParam a WindowProc, тогда как то, что у вас есть-это 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

    Ничего не найдено.