Comment simuler des événements de souris (Windows Forms .NET)

La simulation d’événements de souris dans Windows Forms n’est pas aussi simple que la simulation d’événements de clavier. Windows Forms ne fournit pas de classe d’assistance pour déplacer la souris et appeler des actions de clic de souris. La seule option permettant de contrôler la souris consiste à utiliser des méthodes Windows natives. Si vous utilisez un contrôle personnalisé ou un formulaire, vous pouvez simuler un événement de souris, mais vous ne pouvez pas contrôler directement la souris.

Important

La documentation du Guide du bureau pour .NET 7 et .NET 6 est en cours de construction.

Événements

La plupart des événements ont une méthode correspondante qui les appelle, nommée dans le modèle de On suivi EventName, par exemple OnMouseMove. Cette option n’est possible que dans les contrôles ou formulaires personnalisés, car ces méthodes sont protégées et ne sont pas accessibles en dehors du contexte du contrôle ou du formulaire. L’inconvénient de l’utilisation d’une méthode telle que OnMouseMove c’est qu’elle ne contrôle pas réellement la souris ou interagit avec le contrôle, il déclenche simplement l’événement associé. Par exemple, si vous souhaitez simuler le pointage sur un élément d’un élément dans un ListBox, OnMouseMove et si vous ListBox ne réagissez pas visuellement avec un élément mis en surbrillance sous le curseur.

Ces méthodes protégées sont disponibles pour simuler des événements de souris.

  • OnMouseDown
  • OnMouseEnter
  • OnMouseHover
  • OnMouseLeave
  • OnMouseMove
  • OnMouseUp
  • OnMouseWheel
  • OnMouseClick
  • OnMouseDoubleClick

Pour plus d’informations sur ces événements, consultez Utilisation des événements de souris (Windows Forms .NET)

Appeler un clic

Étant donné que la plupart des contrôles font quelque chose lorsque vous cliquez, comme un bouton appelant le code utilisateur ou case activée box changez son état case activée ed, Windows Forms offre un moyen simple de déclencher le clic. Certains contrôles, tels qu’une zone de liste modifiable, ne font rien de spécial lorsque vous cliquez et simulez un clic n’a aucun effet sur le contrôle.

PerformClick

L’interface System.Windows.Forms.IButtonControl fournit la PerformClick méthode qui simule un clic sur le contrôle. Les contrôles et System.Windows.Forms.LinkLabel les System.Windows.Forms.Button contrôles implémentent cette interface.

button1.PerformClick();
Button1.PerformClick()

InvokeClick

Avec un formulaire d’un contrôle personnalisé, utilisez la InvokeOnClick méthode pour simuler un clic de souris. Il s’agit d’une méthode protégée qui ne peut être appelée qu’à partir du formulaire ou d’un contrôle personnalisé dérivé.

Par exemple, le code suivant clique sur une case activée box à partir de button1.

private void button1_Click(object sender, EventArgs e)
{
    InvokeOnClick(checkBox1, EventArgs.Empty);
}
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    InvokeOnClick(CheckBox1, EventArgs.Empty)
End Sub

Utiliser des méthodes Windows natives

Windows fournit des méthodes que vous pouvez appeler pour simuler des mouvements de souris et des clics tels que User32.dll SendInput et User32.dll SetCursorPos. L’exemple suivant déplace le curseur de la souris au centre d’un contrôle :

[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetCursorPos(int x, int y);

private void button1_Click(object sender, EventArgs e)
{
    Point position = PointToScreen(checkBox1.Location) + new Size(checkBox1.Width / 2, checkBox1.Height / 2);
    SetCursorPos(position.X, position.Y);
}
<Runtime.InteropServices.DllImport("USER32.DLL", EntryPoint:="SetCursorPos")>
Public Shared Function SetCursorPos(x As Integer, y As Integer) As Boolean : End Function

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim position As Point = PointToScreen(CheckBox1.Location) + New Size(CheckBox1.Width / 2, CheckBox1.Height / 2)
    SetCursorPos(position.X, position.Y)
End Sub

Voir aussi