在 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为负时则相反
在代码示例中,directionUp
和directionDown
决定了这个方向。
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));
}
如何设置 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为负时则相反
在代码示例中,directionUp
和directionDown
决定了这个方向。
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));
}