C#에서 마우스 클릭 이벤트 시뮬레이션

Naila Saad Siddiqui 2024년2월15일
  1. C#의 마우스 이벤트
  2. C#에서 마우스 이벤트 시뮬레이션
C#에서 마우스 클릭 이벤트 시뮬레이션

이 간략한 기사는 C#의 마우스 클릭 이벤트 시뮬레이션에 관한 것입니다. 마우스 클릭 이벤트를 시뮬레이트하는 데 도움이 되도록 C# 라이브러리에서 사용할 수 있는 몇 가지 메서드에 대해 설명합니다.

마우스 이벤트를 시뮬레이션한다는 것은 마우스 움직임을 제어하거나 마우스 클릭 이벤트를 트리거할 수 있는 코드를 작성하는 것을 의미하며, 그러면 관련 마우스 이벤트 핸들러를 트리거할 수 있습니다. 마우스 조작(즉, 커서 이동 및 클릭 시뮬레이션)을 위해 기본 Windows 기능을 사용할 수 있습니다.

마우스 이벤트가 무엇이며 이벤트를 시뮬레이트하는 데 사용할 수 없는 이유에 대해 논의하는 것으로 시작하겠습니다.

C#의 마우스 이벤트

대부분의 이벤트에는 이러한 이벤트가 발생할 때 특정 코드 조각을 실행하는 해당 처리기 메서드가 있습니다. 이러한 메서드는 일반적으로 OnMouseMove와 같이 On 뒤에 EventName이 오는 형식을 따릅니다.

컨트롤 또는 양식의 컨텍스트 외부에서 액세스를 방지하는 이러한 메서드의 보호된 특성으로 인해 이 옵션은 사용자 지정 컨트롤 또는 양식 내에서만 사용할 수 있습니다.

이러한 메서드는 이벤트 핸들러(예: OnMouseMove)이며 해당 이벤트가 발생할 때 실행됩니다. 이러한 메서드는 이벤트를 제어하지 않습니다.

예를 들어 OnMouseMove 메서드는 커서의 움직임으로 무언가를 수행하지만 커서 자체를 제어할 수는 없습니다.

특정 마우스 이벤트가 발생할 때 관련 루틴/액션을 실행하는 사용 가능한 이벤트 핸들러 목록은 다음과 같습니다.

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

이 섹션에서 설명한 것처럼 이벤트 처리기는 이벤트 시뮬레이션에 사용할 수 없습니다. 그러나 일부 다른 OS 기본 방법을 사용하여 이벤트를 시뮬레이션할 수 있습니다.

다음 섹션에서 살펴보겠습니다.

C#에서 마우스 이벤트 시뮬레이션

대부분의 컨트롤에는 사용자 코드를 실행하는 단추 또는 체크 상태를 변경하는 확인란과 같은 몇 가지 클릭 관련 동작이 있기 때문에 Windows Forms는 클릭을 시작하는 간단한 방법을 제공합니다. Comboboxes는 클릭 시 응답하지 않는 컨트롤 유형 중 하나이며 클릭 시뮬레이션은 컨트롤에 영향을 주지 않습니다.

PerformClick() 메소드

Microsoft의 System.Windows.Forms.IButtonControlIButtonControl 인터페이스를 통해 사용할 수 있는 PerformClick 메서드를 제공하고 일부 양식 컨트롤에서 클릭을 시뮬레이트합니다. 모든 컨트롤은 System.Windows.Forms.Button을 포함하여 이 인터페이스를 구현합니다.

다음 예제에서는 Windows Form 응용 프로그램을 만들었습니다. 양식에는 두 개의 버튼이 있습니다. 첫 번째 버튼을 클릭하면 PerformClick 메서드를 사용하여 두 번째 버튼을 클릭할 수도 있습니다.

이 코딩 예제의 인터페이스는 다음과 같습니다.

performClick 예시 인터페이스

button1button2,라는 이러한 버튼에 해당하는 핸들러 함수는 다음과 같습니다.

private void button1_Click(object sender, EventArgs e) {
  button2.PerformClick();
}
private void button2_Click(object sender, EventArgs e) {
  MessageBox.Show("Button 2 Clicked!!");
}

위의 코드에서 button1의 이벤트 핸들러에서 button2.PerformClick() 메서드를 호출한 것을 확인할 수 있습니다. 이렇게 하면 button2에 대한 클릭 이벤트 핸들러가 호출되고 결국에는 button2의 핸들러 함수에 코딩된 메시지 상자가 표시됩니다.

PerformClick 예제 출력

확인란에 대한 클릭 호출 및 마우스 움직임 처리

InvokeOnClick 기능을 사용하여 양식의 사용자 지정 컨트롤로 마우스 클릭을 시뮬레이트합니다. 이 메서드는 “보호"되며 양식 또는 파생된 사용자 지정 컨트롤에서만 사용할 수 있습니다.

예를 들어 아래 코드는 버튼을 클릭할 때 체크박스를 선택합니다. 예제의 인터페이스에는 두 개의 확인란과 해당하는 두 개의 버튼이 있습니다.

상단 표제를 표시하는 하나의 레이블이 상단에 배치되고 버튼이 하단에 배치되어 마우스 움직임을 시뮬레이트합니다. 이 인터페이스는 다음과 같습니다.

InvokeOnClick 인터페이스

두 버튼에 대한 이벤트 핸들러 기능은 다음과 같습니다.

private void button1_Click(object sender, EventArgs e) {
  InvokeOnClick(checkBox1, EventArgs.Empty);
}
private void button2_Click(object sender, EventArgs e) {
  InvokeOnClick(checkBox2, EventArgs.Empty);
}

커서를 이동하는 기본 Windows 메서드

Windows 운영 체제는 마우스 이동 및 키보드 이벤트를 제어하는 몇 가지 기본 방법을 제공합니다. 이 예제에서는 마우스 움직임을 제어하고 커서 위치를 변경하는 기능만 설명하고 시연합니다.

위의 예에서 하단의 작동하지 않는 버튼은 마우스 포인터를 제목으로 이동하려면 클릭하세요라고 말합니다. 이 버튼은 커서 위치를 맨 위 제목인 마우스 시뮬레이션 데모로 이동하기 위해 추가되었습니다.

이 버튼을 기능적으로 만들어 봅시다.

user32.dllSystem.Runtime.InteropServices 네임스페이스에 정의된 SetCursorPos API를 제공합니다. 이 메소드는 기본 Windows 프로시저를 호출하며 외부 메소드로 정의되어야 합니다.

다음 코드는 커서 위치를 설정합니다.

[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);
}

레이블의 상단 위치를 얻기 위해 Point 객체를 생성하고 레이블의 중간 지점을 얻기 위해 점을 추가한 다음 좌표를 SetCursorPos 함수에 전달했습니다.

이 예제의 전체 코드는 다음과 같습니다.

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);
    }
  }
}

이 마우스 시뮬레이션의 출력은 아래 이미지에 설명되어 있습니다.

마우스 시뮬레이션 출력

관련 문장 - Csharp Mouse