gpt4 book ai didi

c#如何获取鼠标移动方向?

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:55 25 4
gpt4 key购买 nike

即使鼠标没有在屏幕上移动,是否可以获取鼠标移动方向?例如,它与边缘发生碰撞。

编辑:用户将鼠标移动到顶部并与屏幕的顶部边缘发生碰撞。然后他继续向上移动鼠标。所以鼠标在现实世界中移动但不会在屏幕上移动,因为它不能。我想得到一个信号或其他任何东西来告诉我鼠标在 atm 中移动的方向。

最佳答案

如我所见,基本上您要问的是如何检测鼠标位于屏幕边缘并试图朝边缘方向移动的情况。自然地,MouseMove 事件不会检测到这一点,因为坐标没有改变。

即使光标没有改变位置,使用全局低级鼠标钩子(Hook)可能是获取鼠标移动消息的唯一方法。

这允许检查自上次消息以来坐标是否发生变化。如果没有,我们可能在屏幕的边缘。

public partial class Form1 : Form
{
private const int WH_MOUSE_LL = 14;
private const int WM_MOUSEMOVE = 0x200;

[DllImport("kernel32.dll")]
static extern IntPtr GetModuleHandle(string moduleName);

[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll")]
public static extern int UnhookWindowsHookEx(IntPtr hhook);

[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, uint wParam, IntPtr lParam);
delegate IntPtr HookProc(int nCode, uint wParam, IntPtr lParam);

[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
public POINT pt;
public int mouseData; // be careful, this must be ints, not uints (was wrong before I changed it...). regards, cmew.
public int flags;
public int time;
public UIntPtr dwExtraInfo;
}

[StructLayout(LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}

private HookProc hookProc;
private IntPtr hook;

private POINT formerPoint = new POINT() { X = 0, Y = 0 };

public Form1() { InitializeComponent(); }

IntPtr LowLevelMouseProc(int nCode, uint wParam, IntPtr lParam)
{
if (wParam == WM_MOUSEMOVE)
{
MSLLHOOKSTRUCT infoStr = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT));
if (infoStr.pt.X == formerPoint.X && infoStr.pt.Y == formerPoint.Y)
{
Console.WriteLine("Mouse moved without coordinates changing");
//use the standard way of finding the direction of travel here.
}
formerPoint = infoStr.pt;
}
return CallNextHookEx(IntPtr.Zero, nCode, wParam, lParam);
}

protected override void OnHandleDestroyed(EventArgs e)
{
UnhookWindowsHookEx(hook);
base.OnHandleDestroyed(e);
}

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!DesignMode)
{
hookProc = new HookProc(LowLevelMouseProc);
hook = SetWindowsHookEx(WH_MOUSE_LL, hookProc, GetModuleHandle(null), 0);
}
}
}

*钩子(Hook)代码取自this博客

此方法的问题在于,如果鼠标移动速度低于每条鼠标消息 1 个像素,则会生成误报。

一个可能的部分解决方案是预先检测屏幕边缘的 X 和 Y 值并对其进行测试,但即使这样也不能消除 100% 的误报,因为鼠标有可能位于(例如)屏幕的边缘并非常缓慢地移动(小于 1 像素),这仍会被检测为阳性。

也许有人对如何消除这些误报有更好的想法。

关于c#如何获取鼠标移动方向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12297893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com