2011-12-19 2 views
4

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

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

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

вот код, в котором я сейчас использую + некоторый psuedocode, чтобы лучше объяснить себя (делать пока).

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

Я немного из моей глубины, но любая помощи очень ценится.

Lucas.

    -
+0

Для информации о том, что пространство имен является частью WPF. Вы пытались установить логическую переменную в true, когда вы вводите Grab и False при входе в Release? –

+0

Sneaky WPF, спасибо Марк, скорректировали вопрос. Я подумал о подходе bool, но подумал, что может быть что-то более элегантное. Если I/Anyone не может думать о другом подходе, он будет работать, просто пытаясь избежать того, чтобы всегда было легко выйти из игры :) – Lucas

+0

Объявление неверно, последним аргументом является IntPtr. Пройдите IntPtr.Zero. –

ответ

2

Самый простой ответ был испорчен, чтобы использовать 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

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

Control.MouseButtons.HasFlag(MouseButtons.Left) 

P.S. документацию для этого можно найти on MSDN here.

Смежные вопросы