마우스 이벤트를 시뮬레이트하는 방법(Windows Forms .NET)
Windows Forms의 마우스 이벤트 시뮬레이션은 키보드 이벤트 시뮬레이션만큼 간단하지 않습니다. Windows Forms는 마우스를 이동하고 마우스 클릭 동작을 호출하는 도우미 클래스를 제공하지 않습니다. 마우스를 제어하려면 네이티브 Windows 메서드를 사용해야 합니다. 사용자 지정 컨트롤 또는 양식을 사용하는 경우 마우스 이벤트를 시뮬레이트할 수 있지만 마우스를 직접 제어할 수는 없습니다.
이벤트
대부분의 이벤트에는 이벤트를 호출하는 해당 메서드가 있습니다. 메서드 이름은 On
뒤에 EventName
이 오는 패턴(예: OnMouseMove
)으로 지정됩니다. 해당 메서드는 보호되며 컨트롤 또는 양식 컨텍스트 외부에서 액세스할 수 없기 때문에 이 옵션은 사용자 지정 컨트롤과 양식 내에서만 사용할 수 있습니다. OnMouseMove
와 같은 메서드를 사용하는 경우의 단점은 실제로 마우스를 제어하거나 컨트롤을 조작하지 않고 연결된 이벤트만 발생시킨다는 것입니다. 예를 들어 ListBox의 항목 가리키기를 시뮬레이트하려는 경우 OnMouseMove
및 ListBox
는 커서 아래의 항목을 강조 표시하여 시각적으로 반응하지 않습니다.
보호된 메서드를 사용하여 마우스 이벤트를 시뮬레이트할 수 있습니다.
OnMouseDown
OnMouseEnter
OnMouseHover
OnMouseLeave
OnMouseMove
OnMouseUp
OnMouseWheel
OnMouseClick
OnMouseDoubleClick
관련 이벤트에 대한 자세한 내용은 마우스 이벤트 사용(Windows Forms .NET)을 참조하세요.
클릭 호출
사용자 코드를 호출하는 단추, 선택된 상태를 변경하는 확인란 등과 같이 대부분의 컨트롤이 클릭 시 작업을 수행한다는 점에서 Windows Forms를 사용하면 간편하게 클릭을 트리거할 수 있습니다. 콤보 상자와 같은 일부 컨트롤은 클릭 시 특별한 작업을 수행하지 않으므로 클릭 시뮬레이션이 컨트롤에 영향을 주지 않습니다.
PerformClick
System.Windows.Forms.IButtonControl 인터페이스는 컨트롤 클릭을 시뮬레이트하는 PerformClick 메서드를 제공합니다. System.Windows.Forms.Button 및 System.Windows.Forms.LinkLabel 컨트롤 모두, 이 인터페이스를 구현합니다.
button1.PerformClick();
Button1.PerformClick()
InvokeClick
사용자 지정 컨트롤이 있는 양식의 경우 InvokeOnClick 메서드를 사용하여 마우스 클릭을 시뮬레이트합니다. 이 메서드는 양식이나 파생된 사용자 지정 컨트롤 내에서만 호출할 수 있는 보호된 메서드입니다.
예를 들어 다음 코드에서는 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
네이티브 Windows 메서드 사용
Windows에서는 마우스 이동 및 클릭을 시뮬레이트하기 위해 호출할 수 있는 메서드(예: User32.dll SendInput
및 User32.dll SetCursorPos
)를 제공합니다. 다음 예제에서는 마우스 커서를 컨트롤 가운데로 이동합니다.
[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
참고 항목
.NET Desktop feedback