尝试模拟鼠标点击/拖动

8

我正在尝试模拟鼠标左键单击和左键释放来进行自动拖放操作。

目前是在C# Winforms(是的,Winforms :|)中进行,并且有点棘手。

基本上,一旦发送了单击命令,我希望根据Kinect输入更新光标位置。Kinect方面的问题很好解决,但我不确定如何找到按钮是否仍然被按下。

这是我目前正在使用的代码+一些伪代码来更好地解释自己(使用do while)。

class MouseImpersonator
{
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

    private const int leftDown = 0x02;
    private const int leftUp = 0x04;

    public static void Grab(int xPos, int yPos)
    {
        Cursor.Position = new Point(xPos + 25, yPos + 25);
        mouse_event(leftDown, (uint) xPos, (uint) yPos, 0, 0);

        //do
        //{
        //Cursor.Position = new Point(KinectSettings.movement.LeftHandX, KinectSettings.movement.LeftHandY);
        //} while (the left mouse button is still clicked);
    }

    public static void Release(int xPos, int yPos)
    {
        Cursor.Position = new Point(xPos + 25, yPos + 25);
        mouse_event(leftUp, (uint) xPos, (uint) yPos, 0, 0);
    }
}

我在谷歌上搜索了一下,除了 WPF 的等价物之外找不到我需要的任何东西:http://msdn.microsoft.com/en-us/library/system.windows.input.mouse.aspx

我有点力不从心,但任何帮助都将不胜感激。

卢卡斯。

    -

仅供参考,该命名空间是WPF的一部分。您尝试将布尔变量设置为true,当您进入Grab时,将其设置为False,当您进入Release时吗? - Mark Hall
Sneaky WPF,感谢Mark,我已经调整了问题。我考虑过bool方法,但认为可能有更优雅的解决方案。如果我/任何人想不出其他方法,它也可以工作,只是试图避免总是走捷径 :) - Lucas
声明有误,最后一个参数是IntPtr。 请传递IntPtr.Zero。 - Hans Passant
我敢打赌这是用于 CSGO 自动喷雾控制的。 不管怎样,这正是我需要的。 - rrswa
3个回答

3

最简单的方法是使用bool类型,仅检查正在进行的操作。

我在新线程上启动了它,以免影响其他操作。

理想情况下,您会稍微整理一下。

    public static void Grab(int xPos, int yPos)
    {
        _dragging = true;

        Cursor.Position = new Point(xPos, yPos + offSet);
        mouse_event(leftDown, (uint) xPos, (uint) yPos, 0, 0);

        var t = new Thread(CheckMouseStatus);
        t.Start();
    }
    public static void Release(int xPos, int yPos)
    {
        _dragging = false;
        Cursor.Position = new Point(xPos, yPos + offSet);
        mouse_event(leftUp, (uint) xPos, (uint) yPos, 0, 0);
    }

    private static void CheckMouseStatus()
    {
        do
        {
            Cursor.Position = new Point(KinectSettings.movement.HandX, KinectSettings.movement.HandY + offSet);
        } 
        while (_dragging);
    }

0
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    private static extern void mouse_event(uint dwFlags, int dx, int dy, uint cButtons, uint dwExtraInfo);

    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);

    const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
    const uint MOUSEEVENTF_LEFTUP = 0x0004;
    const uint MOUSEEVENTF_MOVE = 0x0001;

    static void Drag(int startX,int startY,int endX,int endY)
    {
        endX = endX - startX;
        endY = endY - startY;
        SetCursorPos(startX, startY);
        mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
        mouse_event(MOUSEEVENTF_MOVE, endX, endY, 0, 0);
        mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
    }

0
以下代码应该在左鼠标按钮按下时返回true,在松开时返回false,其中Control是System.Windows.Forms.Control:
    Control.MouseButtons.HasFlag(MouseButtons.Left)

附注:此文档可以在MSDN这里找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接