Möglicherweise möchten Sie weitere Informationen bereitstellen, damit Sie eine nützliche Antwort erhalten.
Andy
36
Tipp: Wenn Ihr Titel mit Ihrer Frage übereinstimmt, ist der Titel viel zu lang oder die Frage viel zu kurz. In diesem Fall müssen Sie viel mehr Kontext angeben, damit jeder eine vernünftige Chance hat, Ihnen eine nützliche Antwort zu geben.
Guffa
Antworten:
145
Ich habe mehrere Quellen kombiniert, um den folgenden Code zu erstellen, den ich derzeit verwende. Ich habe auch die Windows.Forms-Referenzen entfernt, damit ich sie ohne zusätzliche Referenzen aus Konsolen- und WPF-Anwendungen verwenden kann.
using System;
using System.Runtime.InteropServices;publicclassMouseOperations{[Flags]publicenumMouseEventFlags{LeftDown=0x00000002,LeftUp=0x00000004,MiddleDown=0x00000020,MiddleUp=0x00000040,Move=0x00000001,Absolute=0x00008000,RightDown=0x00000008,RightUp=0x00000010}[DllImport("user32.dll",EntryPoint="SetCursorPos")][return:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolSetCursorPos(int x,int y);[DllImport("user32.dll")][return:MarshalAs(UnmanagedType.Bool)]privatestaticexternboolGetCursorPos(outMousePoint lpMousePoint);[DllImport("user32.dll")]privatestaticexternvoid mouse_event(int dwFlags,int dx,int dy,int dwData,int dwExtraInfo);publicstaticvoidSetCursorPosition(int x,int y){SetCursorPos(x, y);}publicstaticvoidSetCursorPosition(MousePoint point){SetCursorPos(point.X, point.Y);}publicstaticMousePointGetCursorPosition(){MousePoint currentMousePoint;var gotPoint =GetCursorPos(out currentMousePoint);if(!gotPoint){ currentMousePoint =newMousePoint(0,0);}return currentMousePoint;}publicstaticvoidMouseEvent(MouseEventFlagsvalue){MousePoint position =GetCursorPosition();
mouse_event
((int)value,
position.X,
position.Y,0,0);}[StructLayout(LayoutKind.Sequential)]publicstructMousePoint{publicint X;publicint Y;publicMousePoint(int x,int y){
X = x;
Y = y;}}}
Ich kann keinen Vorteil dieses langen Quellcodes gegenüber dem sehen, was Marcos Placona vor 17 Monaten gepostet hat.
Al Kepp
46
Angesichts der Unbestimmtheit der Frage dachte ich, die Leute könnten von einem Beispiel profitieren, das es ihnen ermöglicht, mehr als nur einen Linksklick zu machen, einen Rechts- oder Mittelklick zu saugen oder ein Klicken und Ziehen zuzulassen.
Keith
2
Funktioniert super. Ich kam hierher und suchte nach so etwas
CSharpie
Dies ist, was ich suche, aber wie klickt man nach unten, bewegt die Maus woanders hin und lässt dann los?
Ninjaxelite
1
@ninjaxelite Ich vermute, Sie senden 1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp). Wickeln Sie es möglicherweise in eine Hilfsmethode ein
Michal Ciechan
137
Ein Beispiel fand ich irgendwo hier in der Vergangenheit. Könnte hilfreich sein:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;publicclassForm1:Form{[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternvoid mouse_event(uint dwFlags,uint dx,uint dy,uint cButtons,uint dwExtraInfo);//Mouse actionsprivateconstint MOUSEEVENTF_LEFTDOWN =0x02;privateconstint MOUSEEVENTF_LEFTUP =0x04;privateconstint MOUSEEVENTF_RIGHTDOWN =0x08;privateconstint MOUSEEVENTF_RIGHTUP =0x10;publicForm1(){}publicvoidDoMouseClick(){//Call the imported function with the cursor's current positionuint X =(uint)Cursor.Position.X;uint Y =(uint)Cursor.Position.Y;
mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y,0,0);}//...other code needed for the application}
Gut gespielt. Verweis auf die ursprüngliche Antwort
hinzugefügt
2
Bei diesem Code wird eine Fehlermeldung angezeigt: Ein Aufruf der PInvoke-Funktion 'MyForm! MyForm.Form1 :: mouse_event' hat den Stapel aus dem Gleichgewicht gebracht. Dies liegt wahrscheinlich daran, dass die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur übereinstimmt. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen. Irgendwelche Ideen?
Abdulla
12
Sie müssen das X und Y in Punkte umwandeln.
Dibesjr
1
Funktioniert perfekt, müssen einige Änderungen der Cursorposition gemäß den Anforderungen vorgenommen werden ...
Anurag Rabadia
14
Einige Steuerelemente, wie z. B. Button in System.Windows.Forms, verfügen über eine "PerformClick" -Methode, um genau das zu tun.
Wenn das Steuerelement keine PerformClick-Methode hat, können Sie eine erweitern / hinzufügen. Sie müssen lediglich OnMouseClick mit einem geeigneten MouseEventArgs-Argument aufrufen.
Es ist seltsam, dass dies im Test-Namespace der Visual Studio-Benutzeroberfläche isoliert wurde, aber ich werde das PInvoke jeden Tag übernehmen, an dem ich Ereignisse nicht nach Gerät filtern muss.
KayleeFrye_onDeck
2
Die Visual Studio Community Edition wird anscheinend nicht mit dieser DLL ausgeliefert.
CM
2
Ich habe gerade eine Stunde damit verbracht, dies zum Laufen zu bringen, indem ich DLLs von einem Projekt mit "codiertem UI-Test" in ein anderes kopiert habe. Wenn Sie keinen Projekttyp mit "codiertem UI-Test" verwenden, lautet mein Rat: Machen Sie sich keine Sorgen. Selbst wenn ich alle erforderlichen DLLs kopiert habe, warf es ein InvalidUITestExtensionPackageException, so dass es leider äußerst pingelig zu sein scheint, in einem bestimmten Projekttyp zu laufen.
Jez
@Jez - Gut zu wissen, danke. Ich habe selbst noch keine Probleme gesehen, aber jetzt weiß ich zumindest, dass es einige gibt; 0)
Rusty Nail
5
Ich habe den Code ausprobiert, den Marcos gepostet hat, und er hat bei mir nicht funktioniert. Was auch immer ich der Y-Koordinate gegeben habe, der Cursor bewegte sich nicht auf der Y-Achse. Der folgende Code funktioniert, wenn Sie die Position des Cursors relativ zur linken Ecke Ihres Desktops und nicht relativ zu Ihrer Anwendung möchten.
[DllImport("user32.dll",CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]publicstaticexternvoid mouse_event(long dwFlags,long dx,long dy,long cButtons,long dwExtraInfo);privateconstint MOUSEEVENTF_LEFTDOWN =0x02;privateconstint MOUSEEVENTF_LEFTUP =0x04;privateconstint MOUSEEVENTF_MOVE =0x0001;publicvoidDoMouseClick(){
X =Cursor.Position.X;
Y =Cursor.Position.Y;//move to coordinates
pt =(Point)pc.ConvertFromString(X +","+ Y);Cursor.Position= pt;//perform click
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);}
Ich benutze nur die mouse_event-Funktion, um den Klick tatsächlich auszuführen. Sie können X und Y die gewünschten Koordinaten geben. Ich habe Werte aus dem Textfeld verwendet:
X =Convert.ToInt32(tbX.Text);
Y =Convert.ToInt32(tbY.Text);
Dies ist die richtige für mich. Sie ist im Grunde Cursor.Positiongut genug, um den Mauszeiger an einer beliebigen Stelle zu positionieren und dann mit WIN32API den eigentlichen Klick auszuführen.
Ge Rong
0
Es sind einige Bedürfnisse, die ich nicht sehen kann, um Dinge wie Keith oder Marcos Placona zu kuppeln, anstatt sie nur zu tun
using System;
using System.Windows.Forms;
namespace WFsimulateMouseClick{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidForm1_Load(object sender,EventArgs e){
button1_Click(button1,newMouseEventArgs(System.Windows.Forms.MouseButtons.Left,1,1,1,1));//by the way//button1.PerformClick();// and//button1_Click(button1, new EventArgs());// are the same}privatevoid button1_Click(object sender,EventArgs e){MessageBox.Show("clicked");}}}
Sie können auch button1_Click (null, null) ausführen, wenn Sie keinen dieser Parameter benötigen.
Sab669
@ Sab669 sicher, aber es hängt immer noch von seinen Bedürfnissen ab :-)
WiiMaxx
Sie sollten nicht nullim zweiten Parameter verwenden, es wird ein werfen NullReferenceException, stattdessen verwendenEventArgs.Empty
Etor Madiv
1
@EtorMadiv wie ich schon sagte, es hängt davon ab, was Sie versuchen zu tun ..., denn wenn Sie es wie oben verwenden, erhalten Sie keineNullReferenceException
Antworten:
Ich habe mehrere Quellen kombiniert, um den folgenden Code zu erstellen, den ich derzeit verwende. Ich habe auch die Windows.Forms-Referenzen entfernt, damit ich sie ohne zusätzliche Referenzen aus Konsolen- und WPF-Anwendungen verwenden kann.
quelle
1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp)
. Wickeln Sie es möglicherweise in eine Hilfsmethode einEin Beispiel fand ich
irgendwohier in der Vergangenheit. Könnte hilfreich sein:quelle
Einige Steuerelemente, wie z. B. Button in System.Windows.Forms, verfügen über eine "PerformClick" -Methode, um genau das zu tun.
quelle
Microsoft.VisualStudio.TestTools.UITesting
quelle
InvalidUITestExtensionPackageException
, so dass es leider äußerst pingelig zu sein scheint, in einem bestimmten Projekttyp zu laufen.Ich habe den Code ausprobiert, den Marcos gepostet hat, und er hat bei mir nicht funktioniert. Was auch immer ich der Y-Koordinate gegeben habe, der Cursor bewegte sich nicht auf der Y-Achse. Der folgende Code funktioniert, wenn Sie die Position des Cursors relativ zur linken Ecke Ihres Desktops und nicht relativ zu Ihrer Anwendung möchten.
Ich benutze nur die mouse_event-Funktion, um den Klick tatsächlich auszuführen. Sie können X und Y die gewünschten Koordinaten geben. Ich habe Werte aus dem Textfeld verwendet:
quelle
Cursor.Position
gut genug, um den Mauszeiger an einer beliebigen Stelle zu positionieren und dann mit WIN32API den eigentlichen Klick auszuführen.Es sind einige Bedürfnisse, die ich nicht sehen kann, um Dinge wie Keith oder Marcos Placona zu kuppeln, anstatt sie nur zu tun
quelle
null
im zweiten Parameter verwenden, es wird ein werfenNullReferenceException
, stattdessen verwendenEventArgs.Empty
NullReferenceException