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.IButtonControl
은 IButtonControl
인터페이스를 통해 사용할 수 있는 PerformClick
메서드를 제공하고 일부 양식 컨트롤에서 클릭을 시뮬레이트합니다. 모든 컨트롤은 System.Windows.Forms.Button
을 포함하여 이 인터페이스를 구현합니다.
다음 예제에서는 Windows Form 응용 프로그램을 만들었습니다. 양식에는 두 개의 버튼이 있습니다. 첫 번째 버튼을 클릭하면 PerformClick
메서드를 사용하여 두 번째 버튼을 클릭할 수도 있습니다.
이 코딩 예제의 인터페이스는 다음과 같습니다.
button1
및 button2,
라는 이러한 버튼에 해당하는 핸들러 함수는 다음과 같습니다.
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
의 핸들러 함수에 코딩된 메시지 상자가 표시됩니다.
확인란에 대한 클릭 호출 및 마우스 움직임 처리
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.dll
은 System.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);
}
}
}
이 마우스 시뮬레이션의 출력은 아래 이미지에 설명되어 있습니다.