Wie simuliert man Mausklicks in C # Winforms-Anwendungen?
Wie simuliert man Mausklicks in C # Winforms-Anwendungen?
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.
using System;
using System.Runtime.InteropServices;
public class MouseOperations
{
[Flags]
public enum MouseEventFlags
{
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)]
private static extern bool SetCursorPos(int x, int y);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool GetCursorPos(out MousePoint lpMousePoint);
[DllImport("user32.dll")]
private static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
public static void SetCursorPosition(int x, int y)
{
SetCursorPos(x, y);
}
public static void SetCursorPosition(MousePoint point)
{
SetCursorPos(point.X, point.Y);
}
public static MousePoint GetCursorPosition()
{
MousePoint currentMousePoint;
var gotPoint = GetCursorPos(out currentMousePoint);
if (!gotPoint) { currentMousePoint = new MousePoint(0, 0); }
return currentMousePoint;
}
public static void MouseEvent(MouseEventFlags value)
{
MousePoint position = GetCursorPosition();
mouse_event
((int)value,
position.X,
position.Y,
0,
0)
;
}
[StructLayout(LayoutKind.Sequential)]
public struct MousePoint
{
public int X;
public int Y;
public MousePoint(int x, int y)
{
X = x;
Y = y;
}
}
}
1. SetCursorPos, 2. MouseEvent(LeftButtonDown), 3. SetCursorPos, 4. MouseEvent(LeftButtonUp)
. Wickeln Sie es möglicherweise in eine Hilfsmethode ein
Ein Beispiel fand ich irgendwo hier in der Vergangenheit. Könnte hilfreich sein:
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
public class Form1 : Form
{
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);
//Mouse actions
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
public Form1()
{
}
public void DoMouseClick()
{
//Call the imported function with the cursor's current position
uint 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
}
Einige Steuerelemente, wie z. B. Button in System.Windows.Forms, verfügen über eine "PerformClick" -Methode, um genau das zu tun.
Mouse.Click();
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.
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x02;
private const int MOUSEEVENTF_LEFTUP = 0x04;
private const int MOUSEEVENTF_MOVE = 0x0001;
public void DoMouseClick()
{
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);
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
using System;
using System.Windows.Forms;
namespace WFsimulateMouseClick
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
button1_Click(button1, new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 1, 1, 1));
//by the way
//button1.PerformClick();
// and
//button1_Click(button1, new EventArgs());
// are the same
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("clicked");
}
}
}
null
im zweiten Parameter verwenden, es wird ein werfen NullReferenceException
, stattdessen verwendenEventArgs.Empty
NullReferenceException