2012-01-05 25 views
9

Ho provato [DllImport ("user32.dll")] extern statico bool SetCursorPos (int X, int Y);Direzione eventi del mouse [DllImport ("user32.dll")] clic, doppio clic

e funziona piuttosto bene per spostare il cursore sul punto desiderato. Non ho mai provato un tipo di importazione DLL prima ma funziona :). Comunque voglio di più cos'altro posso estrarre? Principalmente voglio fare doppio clic, fare clic o utilizzare le opzioni della ruota senza alcun input del mouse, solo il codice come posso farlo? e come posso controllare cos'altro è incluso in user32dll?

Thanx

+0

un argomento che potrebbe essere interessato a è [Automazione interfaccia utente in .NET] (http://msdn.microsoft.com/en -us/library/ms753326 (v = vs.110) aspx). - Inoltre, tieni a mente che le posizioni X e Y sono in coordinate fisiche dello schermo (che sono le stesse di Logical solo per 96 DPI - ma per altri DPI non lo sono - la maggior parte di .NET Framework utilizza le coordinate logiche per tutto). – BrainSlugs83

risposta

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; 

Si dovrebbe importare e definire di questi Constant a lavorare con il mouse utilizzando Win32API

Utilizza il metodo di seguito per fare del mouse Operazione di

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); 
} 

Se si vuole fare un trascinamento del mouse si deve prima Invia MouseDown (clic del mouse) e tienilo premuto mentre cambi la posizione del mouse rispetto a Send MouseUp (Release Click) qualcosa come questo.

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

Informazioni aggiuntive: una chiamata alla funzione PInvoke 'KinectHandTracking! KinectHandTracking.MainWindow :: mouse_event' ha sbilanciato lo stack. Ciò è probabile perché la firma PInvoke gestita non corrisponde alla firma di destinazione non gestita. Verificare che la convenzione di chiamata ei parametri della firma PInvoke corrispondano alla firma non gestita di destinazione. – albatross

+1

per il modo in cui i long dovrebbero essere uint altrimenti fornisce un'eccezione. – albatross

+1

FYI, non devi mischiare 'Cursor.Position' (che funziona in coordinate logiche) con' SetCursorPos' di User32' (che funziona in coordinate fisiche). Ecco un articolo di MSDN su Screen Scaling e UI Automation: http://msdn.microsoft.com/en-us/library/aa970067(v=vs.110).aspx – BrainSlugs83

3

Date un'occhiata a pinvoke.net per un elenco delle API disponibili. Esempi di codice e dichiarazioni di importazione sono inclusi. È anche possibile espandere la selezione a sinistra per visualizzare le API disponibili per ogni DLL.

4

L'utilizzo del tipo lungo genera un errore "PInvoke".

Dovremmo usare 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); 
} 

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