다음을 통해 공유


키보드 이벤트를 시뮬레이트하는 방법(Windows Forms .NET)

Windows Forms는 프로그래밍 방식으로 키보드 입력을 시뮬레이트하는 몇 가지 옵션을 제공합니다. 이 문서에서는 해당 옵션을 간략하게 설명합니다.

SendKeys 사용

Windows Forms는 키 입력을 활성 애플리케이션에 보내기 위한 System.Windows.Forms.SendKeys 클래스를 제공합니다. 키 입력을 애플리케이션에 보내는 두 가지 메서드는 SendKeys.SendSendKeys.SendWait입니다. 두 메서드의 차이점은 SendWait의 경우 Send와 달리 키 입력을 보낼 때 현재 스레드를 차단하여 응답을 기다린다는 것입니다. SendWait에 대한 자세한 내용은 키 입력을 다른 애플리케이션에 보내는 방법을 참조하세요.

주의

다양한 키보드를 통해 전 세계에서 사용하기 위한 애플리케이션인 경우 SendKeys.Send 를 사용하면 예기치 않은 결과가 발생할 수 있으며 피해야 합니다.

내부적으로 SendKeys는 이전 Windows 구현을 사용하여 입력을 보내기 때문에 애플리케이션이 관리 권한으로 실행되지 않을 것으로 예상되는 최신 창에서는 오류가 발생할 수 있습니다. 이전 구현이 실패할 경우 코드에서 입력을 보내기 위해 최신 Windows 구현을 자동으로 시도합니다. 또한 SendKeys 클래스가 새 구현을 사용하는 경우 SendWait 메서드는 키 입력을 다른 애플리케이션에 보낼 때 현재 스레드를 더 이상 차단하지 않습니다.

중요

애플리케이션이 운영 체제와 관계없이 일관된 동작에 의존하는 경우 app.config 파일에 다음 애플리케이션 설정을 추가하여 SendKeys 클래스에서 새 구현을 사용하도록 강제할 수 있습니다.

<appSettings>
  <add key="SendKeys" value="SendInput"/>
</appSettings>

SendKeys 클래스에서 이전 구현’만’ 사용하도록 강제 적용하려면 "JournalHook" 값을 대신 사용합니다.

동일한 애플리케이션에 키 입력을 보내려면

SendKeys.Send 클래스의 SendKeys.SendWait 또는 SendKeys 메서드를 호출합니다. 애플리케이션의 활성 컨트롤이 지정된 키 입력을 받습니다.

다음 코드 예제에서는 Send를 사용하여 AltDown 키를 함께 누르는 동작을 시뮬레이트합니다. 해당 키 입력을 사용하면 ComboBox 컨트롤이 드롭다운을 표시합니다. 이 예제에서는 ButtonComboBox가 있는 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.SendSendKeys.SendWait 메서드는 키 입력을 활성 애플리케이션에 보냅니다. 일반적으로 해당 애플리케이션에서 키 입력을 보냅니다. 키 입력을 다른 애플리케이션에 보내려면 먼저 애플리케이션을 활성화해야 합니다. 다른 애플리케이션을 활성화할 관리형 메서드가 없으므로 네이티브 Windows 메서드를 사용하여 다른 애플리케이션에 포커스를 설정해야 합니다. 다음 코드 예제에서는 플랫폼 호출을 통해 FindWindowSetForegroundWindow 메서드를 호출하여 계산기 애플리케이션 창을 활성화한 다음 Send 를 호출하여 계산기 애플리케이션에 일련의 계산을 실행합니다.

다음 코드 예제에서는 Send를 사용하여 Windows 10 계산기 애플리케이션에 키를 누르는 동작을 시뮬레이트합니다. 먼저 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이 오는 패턴(예: OnKeyPress)으로 지정됩니다. 해당 메서드는 보호되며 컨트롤 또는 양식 컨텍스트 외부에서 액세스할 수 없기 때문에 이 옵션은 사용자 지정 컨트롤과 양식 내에서만 사용할 수 있습니다.

보호된 메서드를 사용하여 키보드 이벤트를 시뮬레이트할 수 있습니다.

  • OnKeyDown
  • OnKeyPress
  • OnKeyUp

관련 이벤트에 대한 자세한 내용은 키보드 이벤트 사용(Windows Forms .NET)을 참조하세요.

참고 항목