Попытка симулировать щелчок мышью / перетаскивание - PullRequest
4 голосов
/ 19 декабря 2011

Поэтому я пытаюсь смоделировать щелчок левой кнопкой мыши и отпускание левой кнопки мыши, чтобы выполнить автоматическое перетаскивание.

В настоящее время он находится в C # Winforms (Да, winforms: |) и в настоящее времянемного гуся.

По сути, после отправки клика, я хочу обновить позицию курсора на основе ввода Kinect.Со стороны Kinect все в порядке, но я не уверен, как узнать, нажата ли кнопка или нет.

вот код, который я сейчас использую + некоторый psuedocode, чтобы лучше объяснить себя (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);
    }
}

Я охотился на Google и не могу найти ничего для того, что мне нужно, кроме эквивалента WPF: http://msdn.microsoft.com/en-us/library/system.windows.input.mouse.aspx

IЯ немного не в себе, но любая помощь очень ценится.

Лукас.

Ответы [ 3 ]

2 голосов
/ 23 декабря 2011

Самый простой ответ: использовать 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 голосов
/ 08 мая 2019
[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 голосов
/ 19 декабря 2011

Следующий код должен возвращать true, если левая кнопка мыши нажата, и false, если она вверху, Control - System.Windows.Forms.Control:

    Control.MouseButtons.HasFlag(MouseButtons.Left)

p.s. документацию для этого можно найти на MSDN здесь .

...