2012-01-05 39 views
9

Intenté [DllImport ("user32.dll")] static ext bool SetCursorPos (int X, int Y);Dirigiendo eventos del mouse [DllImport ("user32.dll")] haga clic en, haga doble clic en

y funciona bastante bien para mover el cursor al punto deseado. Nunca he intentado tal tipo de importación de DLL antes, pero funciona :). Sin embargo, quiero más ¿qué más puedo extraer? Principalmente quiero hacer doble clic, hacer clic o usar las opciones de rueda sin ninguna entrada de mouse, solo el código ¿cómo puedo hacer eso? y ¿cómo puedo verificar qué más está incluido en user32dll?

Gracias

+0

Un tema que podría estar interesado en es [UI Automation en .NET] (http://msdn.microsoft.com/en -us/library/ms753326 (v = vs.110) .aspx). - Además, tenga en cuenta que esas posiciones X e Y se encuentran en las coordenadas de la pantalla física (que son las mismas que las de Logico solo para 96 ​​ppp, pero para otros DPI no lo son), la mayoría de .NET Framework usa coordenadas lógicas para todo). – BrainSlugs83

Respuesta

12
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] 
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo); 
private const uint MOUSEEVENTF_LEFTDOWN = 0x02; 
private const uint MOUSEEVENTF_LEFTUP = 0x04; 
private const uint MOUSEEVENTF_RIGHTDOWN = 0x08; 
private const uint MOUSEEVENTF_RIGHTUP = 0x10; 

debe importar y definir de éstos constante para trabajar con el ratón usando Win32API

utilizar el método de abajo para hacer la operación de

void sendMouseRightclick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 

Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseRightDoubleClick(Point p) 
{ 
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 

    Thread.Sleep(150); 

    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0); 
} 

void sendMouseDown() 
{ 
    mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0); 
} 

void sendMouseUp() 
{ 
    mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0); 
} 

Si usted quiere hacer un arrastre del ratón en primer lugar debería Enviar Ratón MouseDown (clic con el mouse) y mantenerlo pulsado al cambiar la posición del mouse en lugar de enviar MouseUp (clic de liberación), algo así.

sendMouseDown(); 
Cursor.Position = new Point(30,30); 
sendMouseUp(); 
+2

Información adicional: una llamada a la función PInvoke 'KinectHandTracking! KinectHandTracking.MainWindow :: mouse_event' ha desequilibrado la pila. Esto es probable porque la firma de PInvoke administrada no coincide con la firma de destino no administrada. Compruebe que la convención de llamada y los parámetros de la firma PInvoke coinciden con la firma no administrada de destino. – albatross

+1

por cierto, longs debe ser uint de lo contrario, se da una excepción. – albatross

+1

FYI, no debe mezclar 'Cursor.Position' (que funciona en coordenadas lógicas) con' SetCursorPos' de 'User32' (que funciona en coordenadas físicas). Aquí hay un artículo de MSDN sobre escala de pantalla y automatización de UI: http://msdn.microsoft.com/en-us/library/aa970067(v=vs.110).aspx – BrainSlugs83

3

Tome un vistazo a pinvoke.net para obtener una lista de las APIs disponibles. Ejemplos de código y las declaraciones de importación están incluidos. También puede expandir la selección a la izquierda para ver las API disponibles para cada DLL.

4

El uso del tipo largo genera un error "PInvoke".

Debemos utilizar tipo int:

[DllImport("user32.dll")] 
static extern void mouse_event(int dwFlags, int dx, int dy, 
         int dwData, int dwExtraInfo); 

[Flags] 
public enum MouseEventFlags 
{ 
    LEFTDOWN = 0x00000002, 
    LEFTUP = 0x00000004, 
    MIDDLEDOWN = 0x00000020, 
    MIDDLEUP = 0x00000040, 
    MOVE = 0x00000001, 
    ABSOLUTE = 0x00008000, 
    RIGHTDOWN = 0x00000008, 
    RIGHTUP = 0x00000010 
} 

public static void LeftClick(int x, int y) 
{ 
    Cursor.Position = new System.Drawing.Point(x, y); 
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 
} 

fuente: http://www.pinvoke.net/default.aspx/user32.mouse_event