получить WHEEL_DELTA из wParam в сообщении WM_MOUSEHWHEEL в C # - PullRequest
5 голосов
/ 17 февраля 2012

Я использую глобальные хуки из user32.dll с dllimport в C #.Клавиатура 1 работает нормально, но проблемы с колесом мыши являются проблемой.Это мой обратный вызов для события мыши:

        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 , я использую этот код, который должен выполнять эту работу:

приватное статическое int GetWheelDeltaWParam (int wparam) {return (int) (wparam>)> 16);}

Но вывод всегда равен 0, что не имеет никакого смысла.

EDIT - результат:

        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 ]

4 голосов
/ 17 февраля 2012

Проблема в том, что GET_WHEEL_DELTA_WPARAM предназначен для извлечения дельты колеса мыши из wParam из WindowProc, тогда как у вас есть LowLevelMouseProc обратный вызов, В вашем случае ,

wParam [in]

Тип: WPARAM

Идентификатор сообщения мыши. Этот параметр может быть одним из следующих сообщений: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_MOUSEHWHEEL, WM_RBUTTONDOWN или WM_RBUTTONUP.

wParam - это просто WM_MOUSEWHEEL; чтобы получить колесо дельта, нужно заглянуть в

lParam [in]

Тип: LPARAM

Указатель на структуру MSLLHOOKSTRUCT.

и внутри этой структуры

mouseData

Тип: DWORD

Если сообщение WM_MOUSEWHEEL, старшим словом этого члена является дельта колеса. Слово младшего разряда зарезервировано. Положительный значение указывает, что колесо было повернуто вперед, от пользователь; отрицательное значение указывает, что колесо было повернуто назад, к пользователю. Один щелчок колеса определяется как WHEEL_DELTA, что 120.

вы найдете свою ценность.

Пожалуйста, не спрашивайте меня о необходимых деталях C # P / Invoke для работы с этой структурой, поскольку я почти наверняка пойму их неправильно:)

0 голосов
/ 06 апреля 2015

Здесь вы ищете WM_MOUSE**H**WHEEL, которое представляет собой горизонтальное движение колеса (из стороны в сторону) ,

НЕ прокручивающее действие колеса, которое составляет WM_MOUSEWHEE L.

        if (eventType == WM_MOUSE**H**WHEEL)
        {
            int wheelMovement = GetWheelDeltaWParam(eventType);
        }

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

...