Windows Forms는 프로그래밍 방식으로 키보드 입력을 시뮬레이트하는 몇 가지 옵션을 제공합니다. 이 문서에서는 해당 옵션을 간략하게 설명합니다.
SendKeys 사용
Windows Forms는 키 입력을 활성 애플리케이션에 보내기 위한 System.Windows.Forms.SendKeys 클래스를 제공합니다. 키 입력을 애플리케이션에 보내는 두 가지 메서드는 SendKeys.Send 및 SendKeys.SendWait입니다. 두 메서드의 차이점은 SendWait의 경우 Send와 달리 키 입력을 보낼 때 현재 스레드를 차단하여 응답을 기다린다는 것입니다. SendWait에 대한 자세한 내용은 키 입력을 다른 애플리케이션에 보내는 방법을 참조하세요.
주의
애플리케이션이 다양한 키보드 SendKeys.Send 에서 국제적인 용도로 사용되는 경우 예측할 수 없는 결과를 얻을 수 있으므로 피해야 합니다.
백그라운드 SendKeys 에서 이전 Windows 구현을 사용하여 입력을 전송합니다. 이 구현은 애플리케이션이 관리 권한으로 실행되지 않을 것으로 예상되는 Windows에서 실패할 수 있습니다. 이전 구현이 실패할 경우 코드에서 입력을 보내기 위해 최신 Windows 구현을 자동으로 시도합니다. 또한 SendKeys 클래스가 새 구현을 사용하는 경우 SendWait 메서드는 키 입력을 다른 애플리케이션에 보낼 때 현재 스레드를 더 이상 차단하지 않습니다.
중요합니다
애플리케이션이 운영 체제와 관계없이 일관된 동작에 의존하는 경우 app.config 파일에 다음 애플리케이션 설정을 추가하여 SendKeys 클래스에서 새 구현을 사용하도록 강제할 수 있습니다.
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
SendKeys 클래스에서 이전 구현’만’ 사용하도록 강제 적용하려면 "JournalHook" 값을 대신 사용합니다.
동일한 애플리케이션에 키 입력을 보내려면
Send 클래스의 SendWait 또는 SendKeys 메서드를 호출합니다. 지정된 키 입력은 애플리케이션의 활성 컨트롤에 의해 수신됩니다.
다음 코드 예제에서는 Send 키와 아래쪽 화살표 키를 함께 누르는 시뮬레이션을 사용합니다. 해당 키 입력을 사용하면 ComboBox 컨트롤이 드롭다운을 표시합니다. 이 예제에서는 Button 및 ComboBox가 있는 Form을 가정합니다.
private void button1_Click(object sender, EventArgs e)
{
comboBox1.Focus();
SendKeys.Send("%+{DOWN}");
}
Private Sub Button1_Click(sender As Object, e As EventArgs)
ComboBox1.Focus()
SendKeys.Send("%+{DOWN}")
End Sub
다른 애플리케이션에 키 입력을 보내려면
SendKeys.Send 및 SendKeys.SendWait 메서드는 키 입력을 활성 애플리케이션에 보냅니다. 일반적으로 해당 애플리케이션에서 키 입력을 보냅니다. 키 입력을 다른 애플리케이션에 보내려면 먼저 애플리케이션을 활성화해야 합니다. 다른 애플리케이션을 활성화할 관리형 메서드가 없으므로 네이티브 Windows 메서드를 사용하여 다른 애플리케이션에 포커스를 설정해야 합니다. 다음 코드 예제에서는 플랫폼 호출을 통해 FindWindow 및 SetForegroundWindow 메서드를 호출하여 계산기 애플리케이션 창을 활성화한 다음 SendWait 를 호출하여 계산기 애플리케이션에 일련의 계산을 실행합니다.
다음 코드 예제에서는 Windows 계산기 애플리케이션에 키를 누르는 시뮬레이션을 사용 Send 합니다. 먼저 Calculator라는 이름으로 애플리케이션 창을 검색하여 활성화합니다. 활성화되면 키 입력이 전송되어 10+10을 계산합니다.
[DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
private void button1_Click(object sender, EventArgs e)
{
IntPtr calcWindow = FindWindow(null, "Calculator");
if (SetForegroundWindow(calcWindow))
SendKeys.Send("10{+}10=");
}
<Runtime.InteropServices.DllImport("USER32.DLL", CharSet:=Runtime.InteropServices.CharSet.Unicode)>
Public Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr : End Function
<Runtime.InteropServices.DllImport("USER32.DLL")>
Public Shared Function SetForegroundWindow(hWnd As IntPtr) As Boolean : End Function
Private Sub Button1_Click(sender As Object, e As EventArgs)
Dim hCalcWindow As IntPtr = FindWindow(Nothing, "Calculator")
If SetForegroundWindow(hCalcWindow) Then
SendKeys.Send("10{+}10=")
End If
End Sub
OnEventName 메서드 사용
키보드 이벤트를 시뮬레이트하는 가장 쉬운 방법은 이벤트를 발생시키는 개체에서 메서드를 호출하는 것입니다. 대부분의 이벤트에는 이벤트를 호출하는 해당 메서드가 있습니다. 메서드 이름은 On 뒤에 EventName이 오는 패턴(예: OnMouseMove)으로 지정됩니다. 해당 메서드는 보호되며 컨트롤 또는 양식 컨텍스트 외부에서 액세스할 수 없기 때문에 이 옵션은 사용자 지정 컨트롤과 양식 내에서만 사용할 수 있습니다.
보호된 메서드를 사용하여 키보드 이벤트를 시뮬레이트할 수 있습니다.
OnKeyDownOnKeyPressOnKeyUp
이러한 이벤트에 대한 자세한 내용은 키보드 이벤트 사용을 참조하세요.
참고하십시오
.NET Desktop feedback