Làm thế nào để bạn mô phỏng các lần nhấp chuột trong các ứng dụng winforms của C #?
Làm thế nào để bạn mô phỏng các lần nhấp chuột trong các ứng dụng winforms của C #?
Câu trả lời:
Tôi đã kết hợp một số nguồn để tạo mã dưới đây, hiện tôi đang sử dụng. Tôi cũng đã xóa các tham chiếu Windows.Forms để tôi có thể sử dụng nó từ các ứng dụng console và WPF mà không cần thêm tài liệu tham khảo.
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)
. Có khả năng bọc nó trong một phương pháp trợ giúp
Một ví dụ tôi thấy đâu đó ở đây trong quá khứ. Có thể là một số trợ giúp:
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
}
Một số điều khiển, như Nút trong System.Windows.Forms, có phương thức "PerformanceClick" để làm việc đó.
Mouse.Click();
InvalidUITestExtensionPackageException
, vì vậy nó dường như cực kỳ cầu kỳ về việc chạy trong một loại dự án cụ thể, thật đáng buồn.
Tôi đã thử mã mà Marcos đã đăng và nó không hoạt động với tôi. Bất cứ điều gì tôi được trao cho tọa độ Y, con trỏ không di chuyển trên trục Y. Mã bên dưới sẽ hoạt động nếu bạn muốn vị trí của con trỏ so với góc bên trái của màn hình nền, không liên quan đến ứng dụng của bạn.
[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);
}
Tôi chỉ sử dụng chức năng mouse_event để thực hiện nhấp chuột. Bạn có thể cung cấp cho X và Y tọa độ bạn muốn, tôi đã sử dụng các giá trị từ hộp văn bản:
X = Convert.ToInt32(tbX.Text);
Y = Convert.ToInt32(tbY.Text);
Cursor.Position
là đủ tốt để định vị con trỏ chuột đến bất cứ nơi nào bạn muốn, sau đó sử dụng WIN32API để thực hiện nhấp chuột thực tế.
chúng là một số nhu cầu mà tôi không thể thấy đối với những thứ như Keith hay Marcos Placona đã làm thay vì chỉ làm
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
trong tham số thứ hai, nó sẽ ném một NullReferenceException
, thay vào đó sử dụngEventArgs.Empty
NullReferenceException