2011-01-10 11 views
1

Ich habe ein Stück Code geschrieben, um Mausklick zu simulieren, der in meinem Vista funktioniert. Aber wenn ich das in Windows 7 getestet habe, erzeugt es das Klickereignis nicht. Könnte jemand bitte helfen? Ich füge das unten stehende Code-Snippet hinzu. Danke, NikilSimulieren Mausklick und Mausbewegung in Windows 7 mit C#

[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 
     } 

System.Windows.Forms.Cursor.Hide(); 
System.Windows.Forms.Cursor.Position = new System.Drawing.Point(xinc + rct.Left, yinc + rct.Top); 

int X = System.Windows.Forms.Cursor.Position.X; 
int y = System.Windows.Forms.Cursor.Position.Y; 

mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 


System.Windows.Forms.Cursor.Position = new System.Drawing.Point(0, 0); 
System.Windows.Forms.Cursor.Show(); 
+0

mouse_event wurde vollständig von SendInput ersetzt. Funktioniert Ihr Code, wenn er auf SendInput aktualisiert wurde? – Michael

+0

@Michael: HI Könnten Sie bitte ein Beispiel oder einen Link angeben, um die send-Eingabe in C# zu verwenden? – Nikil

Antwort

9

Meine Kristallkugel sagt Ihnen Win7 nicht nur habe ein Upgrade, Sie haben auch die 64-Bit-Version. Zuvor hatten Sie die 32-Bit-Version von Vista. Ihre mouse_event() -Deklaration ist falsch. Das letzte Argument ist IntPtr, nicht Int.

Wie hat der Ball gemacht?

+0

Das ist seltsam, die genau gleiche Sig, die er verwendet, funktioniert gut für mich: http://StackOverflow.com/questions/1740045/simulating-a-mouse-button-click-in-windows/3002585#3002585 –

+0

@ohadsc - der Pinvoke .net Link ist überall, mit IntPtr und Int. Ihre Deklaration kann nur mit der 32-Bit-Version von Windows * oder * Windows Mobile funktionieren. Letzteres dokumentiert es als int. Was in Ordnung ist, wird es nie eine 64-Bit-Version geben. Vielleicht gibt es einen guten Grund, warum diese Funktion veraltet ist :) –

+0

Die markierte Antwort in diesem Thread ist erstaunlich falsch. Niemand kann das schaffen, egal welches Betriebssystem sie verwenden. Vielleicht haben sie viele Nullen passiert. –

0

Nicht sicher, ob Ihnen das weiterhilft, aber haben Sie sich die UI Automation angeschaut? link text

0

Ein Trick, der für mich gearbeitet hat, ist SetCursorPos mit der gleichen Koordinate vor dem Aufruf. Ich habe auch gerade Folgendes überprüft, um zu arbeiten (auf Winforms):

public static void LeftClick(int x, int y) 
    { 
     Cursor.Position = new System.Drawing.Point(x, y); //<= fails without this 
     mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0); 
     mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0); 
    } 
Verwandte Themen