Simular eventos de clic del mouse en C#
Este breve artículo trata sobre la simulación de eventos con un clic del mouse en C#. Analizaremos algunos de los métodos disponibles en las bibliotecas de C# para ayudarnos a simular el evento de clic del mouse.
Simular eventos del mouse significa escribir un código que pueda controlar los movimientos del mouse o desencadenar el evento de clic del mouse, que, a su vez, puede desencadenar los controladores de eventos del mouse relevantes. Podemos usar funcionalidades nativas de Windows para manipular el mouse (es decir, simular los movimientos y clics del cursor).
Comencemos discutiendo qué son los eventos del mouse y por qué no se pueden usar para simular los eventos.
Eventos de ratón en C#
La mayoría de los eventos tienen un método de controlador correspondiente que ejecuta ciertas piezas de código cuando ocurren estos eventos. Estos métodos suelen seguir el formato de On
seguido de EventName
, como OnMouseMove
.
Debido a la naturaleza protegida de estos métodos, que impiden el acceso desde fuera del contexto del control o formulario, esta opción solo está disponible dentro de los controles o formularios personalizados.
Estos métodos son solo controladores de eventos (por ejemplo, OnMouseMove
) y se ejecutan cuando ocurre el evento correspondiente. Estos métodos no controlan los eventos.
Por ejemplo, el método OnMouseMove
hará algo con el movimiento del cursor pero no puede controlar el cursor en sí.
La lista de controladores de eventos disponibles que ejecutan rutinas/acciones asociadas cuando ocurre un evento de mouse específico es la siguiente:
OnMouseDown
OnMouseEnter
OnMouseHover
OnMouseLeave
OnMouseMove
OnMouseUp
OnMouseWheel
OnMouseClick
OnMouseDoubleClick
Como se explica en esta sección, los controladores de eventos no se pueden usar para simular eventos. Sin embargo, algunos otros métodos nativos del sistema operativo están disponibles para simular los eventos.
Vamos a explorarlos en la siguiente sección.
Simular eventos de ratón en C#
Windows Forms ofrece métodos simples para iniciar el clic porque la mayoría de los controles tienen algunas acciones asociadas al clic, como un “botón” que ejecuta el código de usuario o una “casilla de verificación” que cambia su estado marcado. Los Cuadros combinados
son un tipo de control que no responde cuando se hace clic, y simular un clic no tiene impacto en el control.
el método PerformClick()
El System.Windows.Forms.IButtonControl
de Microsoft proporciona el método PerformClick
, disponible a través de la interfaz IButtonControl
, y simula un clic en algún control de formulario. Todos los controles implementan esta interfaz, incluido System.Windows.Forms.Button
.
En el siguiente ejemplo, hemos creado una aplicación de formulario de Windows. El formulario contiene dos botones. Al hacer clic en el primer botón, también podemos hacer clic en el segundo botón utilizando el método PerformClick
.
La interfaz de este ejemplo de codificación se verá así:
Las funciones de manejo correspondientes para estos botones, denominados botón1
y botón2
, son las siguientes:
private void button1_Click(object sender, EventArgs e) {
button2.PerformClick();
}
private void button2_Click(object sender, EventArgs e) {
MessageBox.Show("Button 2 Clicked!!");
}
En el código anterior, puede ver que hemos llamado al método button2.PerformClick()
en el controlador de eventos de button1
. Esto llamará al controlador de eventos de clic para botón2
y, finalmente, mostrará el cuadro de mensaje codificado en la función de controlador de botón2
.
Invocar clic para la casilla de verificación y manejar los movimientos del mouse
Utilice la función InvokeOnClick
para simular un clic del mouse con el control personalizado de un formulario. Este método está protegido
y solo puede ser utilizado por el formulario o control personalizado derivado.
Por ejemplo, el siguiente código selecciona una casilla de verificación al hacer clic en el botón. La interfaz del ejemplo contiene dos casillas de verificación y sus dos botones correspondientes.
Una etiqueta
que muestra el encabezado superior se coloca en la parte superior y un botón
en la parte inferior para simular el movimiento del mouse. Esta interfaz se muestra a continuación:
Las funciones del controlador de eventos para los dos botones serán:
private void button1_Click(object sender, EventArgs e) {
InvokeOnClick(checkBox1, EventArgs.Empty);
}
private void button2_Click(object sender, EventArgs e) {
InvokeOnClick(checkBox2, EventArgs.Empty);
}
Métodos nativos de Windows para mover el cursor
El sistema operativo Windows proporciona algunos métodos nativos para controlar los movimientos del mouse y los eventos del teclado. Para este ejemplo, discutiremos y demostraremos solo las funciones para controlar los movimientos del mouse y cambiar la posición del cursor.
En el ejemplo anterior, un botón no funcional en la parte inferior dice: Haz clic en mí para mover el puntero del mouse al encabezado
. Este botón se agrega para mover la posición del cursor hacia el encabezado superior: Mouse Simulation Demo
.
Hagamos que este botón sea funcional.
El user32.dll
proporciona la API SetCursorPos
, definida en el espacio de nombres System.Runtime.InteropServices
. Este método invoca procedimientos nativos de Windows y debe definirse como un método externo.
El siguiente código establecerá la posición del cursor:
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
[return:MarshalAs(UnmanagedType.Bool)]
private static extern bool SetCursorPos(int x, int y);
private void button3_Click(object sender, EventArgs e) {
Point position = PointToScreen(label1.Location) + new Size(label1.Width / 2, label1.Height / 2);
SetCursorPos(position.X, position.Y);
}
Creamos un objeto Point
para obtener la ubicación de la etiqueta en la parte superior, agregamos los puntos para obtener el punto medio de la etiqueta y luego pasamos sus coordenadas a la función SetCursorPos
.
El código completo para este ejemplo será:
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WinFormsApp2 {
public partial class Form1 : Form {
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
[return:MarshalAs(UnmanagedType.Bool)]
private static extern bool SetCursorPos(int x, int y);
public Form1() {
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) {
InvokeOnClick(checkBox1, EventArgs.Empty);
}
private void button2_Click(object sender, EventArgs e) {
InvokeOnClick(checkBox2, EventArgs.Empty);
}
private void button3_Click(object sender, EventArgs e) {
Point position =
PointToScreen(label1.Location) + new Size(label1.Width / 2, label1.Height / 2);
SetCursorPos(position.X, position.Y);
}
}
}
El resultado de esta simulación de ratón se muestra en la siguiente imagen: