Bagaimana Anda mensimulasikan klik Mouse di aplikasi C # winforms?
Bagaimana Anda mensimulasikan klik Mouse di aplikasi C # winforms?
Jawaban:
Saya telah menggabungkan beberapa sumber untuk menghasilkan kode di bawah ini, yang saat ini saya gunakan. Saya juga telah menghapus referensi Windows.Forms sehingga saya dapat menggunakannya dari aplikasi konsol dan WPF tanpa referensi tambahan.
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)
. Secara potensial membungkusnya dalam metode pembantu
Contoh saya menemukan suatu tempat di sini di masa lalu. Mungkin bisa membantu:
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
}
Beberapa kontrol, seperti Tombol di System.Windows.Forms, memiliki metode "PerformClick" untuk melakukan hal itu.
Mouse.Click();
InvalidUITestExtensionPackageException
, jadi sepertinya sangat cerewet menjalankan dalam jenis proyek tertentu, sayangnya.
Saya telah mencoba kode yang diposting Marcos dan tidak berhasil untuk saya. Apa pun yang saya diberikan pada koordinat Y, kursor tidak bergerak pada sumbu Y. Kode di bawah ini akan berfungsi jika Anda ingin posisi kursor relatif ke sudut kiri desktop Anda, bukan relatif terhadap aplikasi Anda.
[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);
}
Saya hanya menggunakan fungsi mouse_event untuk benar-benar melakukan klik. Anda dapat memberi X dan Y koordinat apa yang Anda inginkan, saya menggunakan nilai dari kotak teks:
X = Convert.ToInt32(tbX.Text);
Y = Convert.ToInt32(tbY.Text);
Cursor.Position
cukup baik untuk memposisikan kursor mouse ke mana pun Anda inginkan, lalu gunakan WIN32API untuk melakukan klik yang sebenarnya.
mereka adalah beberapa kebutuhan saya tidak bisa melihat ke kubah hal seperti Keith atau Marcos Placona lakukan daripada hanya melakukan
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
dalam parameter kedua, itu akan membuang NullReferenceException
, alih-alih gunakanEventArgs.Empty
NullReferenceException