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));
}