在 WM_MOUSEWHEEL 消息中设置 Delta 以使用 PostMessage 发送

Set Delta in a WM_MOUSEWHEEL message to send with PostMessage

如何设置 WM_MOUSEWHEEL 消息的 Delta 参数并使用 PostMessage 将消息发送到 Windows?

我的代码:

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

当我这样做时,我有:

Windows 不滚动,因为增量为 0

WHEEL_DELTA 是鼠标滚轮增量的默认值(对于没有自由旋转滚轮的鼠标控制器)。此值由 SystemInformation.MouseWheelScrollDelta.
返回 它通常设置为 120,但也可以是不同的值。
当Delta值为正时,表示鼠标滚轮向前转动,导致Window向上滚动,Delta为负时则相反
在代码示例中,directionUpdirectionDown决定了这个方向。

Delta 可以设置为基本增量的分数或倍数(可用于微调滚动)。有关详细信息,请参阅有关 WM_MOUSEWHEEL 的文档。

例子中,车轮增量被分成两半(float multiplier参数MAKEWPARAM 设置为 .5f).

[Handle]识别的Window不需要激活(不需要是ForegroundWindow ).

Cursor位置表示屏幕坐标。该应用程序应该是 DpiAware 才能正确处理光标位置和屏幕坐标。
请在此处查看有关 VirtualScreen 的说明以及 DpiAwareness 的作用:

.

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