Установите Delta в сообщении WM_MOUSEWHEEL для отправки с PostMessage - PullRequest
0 голосов
/ 13 февраля 2020

Как установить параметр Delta в сообщении WM_MOUSEWHEEL и отправить сообщение на Windows, используя PostMessage?

Мой код:

[DllImport("user32.dll")]
static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

const uint WM_MOUSEWHEEL = 0x020A;

private int MAKELPARAM(int p, int p_2)
{
    return ((p_2 << 16) | (p & 0xFFFF));
}

Теперь я использую это так:

IntPtr hwnd1;
hwnd1 = FindWindow(null, "NoxPlayer");
Point location = new Point(1205,411);
PostMessage(hwnd1, WM_MOUSEWHEEL, 0, MAKELPARAM(location.X, location.Y));

Когда я делаю это так, у меня есть:

enter image description here

The Windows не прокручивается, потому что дельта 0.

1 Ответ

2 голосов
/ 13 февраля 2020

WHEEL_DELTA является значением по умолчанию приращения колеса мыши (для контроллеров мыши без свободно вращающегося колеса). Это значение возвращается SystemInformation.MouseWheelScrollDelta .
Обычно оно имеет значение 120, но может иметь другое значение.
Если значение Delta положительное, это означает, что колесо мыши поворачивается вперед, вызывая прокрутку окна вверх, противоположное при отрицательном значении дельты.
В примере кода directionUp и directionDown определяют это направление.

Дельта может быть установлена ​​на дробную или кратную базового приращения (может использоваться для точной настройки прокрутки). См. Документы о WM_MOUSEWHEEL для получения дополнительной информации.

В этом примере приращение колеса делится пополам (аргумент float multiplier макроса MAKEWPARAM установлен на .5f ).

Окно, обозначенное [Handle], не нужно активировать (оно не должно быть окном переднего плана).

Положение Курсор представляет координаты экрана. Приложение должно быть DpiAware для правильной обработки позиций курсора и координат экрана.
См. Примечания о VirtualScreen и о том, как DpiAwareness используется здесь:

Использование SetWindowPos с несколькими мониторами .

int directionUp = 1;
int directionDown = -1;

// Scrolls [Handle] down by 1/2 wheel rotation with Left Button pressed
IntPtr wParam = MAKEWPARAM(directionDown, .5f, WinMsgMouseKey.MK_LBUTTON);
IntPtr lParam = MAKELPARAM(Cursor.Position.X, Cursor.Position.Y);

PostMessage([Handle], WM_MOUSEWHEEL, wParam, lParam);

internal const uint WM_MOUSEWHEEL = 0x020A;

[Flags]
public enum WinMsgMouseKey : int
{
    MK_NONE = 0x0000,
    MK_LBUTTON = 0x0001,
    MK_RBUTTON = 0x0002,
    MK_SHIFT = 0x0004,
    MK_CONTROL = 0x0008,
    MK_MBUTTON = 0x0010,
    MK_XBUTTON1 = 0x0020,
    MK_XBUTTON2 = 0x0040
}

[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
internal static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

internal static IntPtr MAKEWPARAM(int direction, float multiplier, WinMsgMouseKey button)
{
    int delta = (int)(SystemInformation.MouseWheelScrollDelta * multiplier);
    return (IntPtr)(((delta << 16) * Math.Sign(direction) | (ushort)button));
}

internal static IntPtr MAKELPARAM(int low, int high)
{
    return (IntPtr)((high << 16) | (low & 0xFFFF));
}
...