programing

C#에서 키 누르기 이벤트를 프로그래밍 방식으로 생성하려면 어떻게 해야 합니까?

telecom 2023. 4. 15. 08:21
반응형

C#에서 키 누르기 이벤트를 프로그래밍 방식으로 생성하려면 어떻게 해야 합니까?

키보드로 키를 누르는 것을 시뮬레이트하는 이벤트를 프로그래밍 방식으로 작성하려면 어떻게 해야 합니까?

질문에는 WPF라는 태그가 붙어 있습니다만, 지금까지의 답변은 특정 WinForms와 Win32입니다.

WPF에서 이를 수행하려면 KeyEventArgs를 구축하고 타깃으로 RaiseEvent를 호출하기만 하면 됩니다.예를 들어 Insert Key Down 이벤트를 현재 포커스에 있는 요소로 전송하려면 다음 절차를 수행합니다.

var key = Key.Insert;                    // Key to send
var target = Keyboard.FocusedElement;    // Target element
var routedEvent = Keyboard.KeyDownEvent; // Event to send
     target.RaiseEvent(
  new KeyEventArgs(
    Keyboard.PrimaryDevice,
    PresentationSource.FromVisual(target),
    0,
    key)
  { RoutedEvent=routedEvent }
);

이 솔루션은 네이티브 콜이나 Windows의 내부 콜에 의존하지 않기 때문에 다른 솔루션보다 훨씬 신뢰성이 높아집니다.또한 특정 요소에서 키 프레스를 시뮬레이션할 수도 있습니다.

이 코드는 PreviewKeyDown, KeyDown, PreviewKeyUp 및 KeyUp 이벤트에만 적용됩니다.TextInput 이벤트를 전송하려면 다음 절차를 수행합니다.

var text = "Hello";
var target = Keyboard.FocusedElement;
var routedEvent = TextCompositionManager.TextInputEvent;

target.RaiseEvent(
  new TextCompositionEventArgs(
    InputManager.Current.PrimaryKeyboardDevice,
    new TextComposition(InputManager.Current, target, text))
  { RoutedEvent = routedEvent }
);

또, 다음의 점에 주의해 주세요.

  • 컨트롤은 미리보기 이벤트를 수신해야 합니다(예: PreviewKeyDown은 KeyDown 앞에 와야 함).

  • 타겟을 사용하다.RaiseEvent(...)는 액셀러레이터, 텍스트 구성 및 IME와 같은 메타 처리 없이 이벤트를 타겟으로 직접 전송합니다.일반적으로 이것은 사용자가 원하는 것입니다.한편 실제 키보드 키를 시뮬레이션하는 작업을 실제로 수행할 경우 Input Manager를 사용합니다.대신 ProcessInput()을 사용합니다.

Windows Forms 컨텍스트를 사용하지 않고 주요 이벤트를 생성하려면 다음 방법을 사용합니다.

[DllImport("user32.dll")]
public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);

샘플 코드는 다음과 같습니다.

const int VK_UP = 0x26; //up key
const int VK_DOWN = 0x28;  //down key
const int VK_LEFT = 0x25;
const int VK_RIGHT = 0x27;
const uint KEYEVENTF_KEYUP = 0x0002;
const uint KEYEVENTF_EXTENDEDKEY = 0x0001;
int press()
{
    //Press the key
    keybd_event((byte)VK_UP, 0, KEYEVENTF_EXTENDEDKEY | 0, 0);
    return 0;
}

가상 키 목록은 여기에 정의됩니다.

전체 그림을 보려면 아래 링크를 사용하십시오. http://tksinghal.blogspot.in/2011/04/how-to-press-and-hold-keyboard-key.html

사용한 적은 없지만 SendKeys가 원하는 대로 할 수 있습니다.

SendKeys를 사용하여 키 입력 및 키 입력 조합을 활성 응용 프로그램으로 보냅니다.이 클래스는 인스턴스화할 수 없습니다.클래스에 키 스트로크를 보내고 프로그램 흐름을 즉시 계속하려면 보내기를 사용합니다.키 입력으로 시작된 프로세스를 대기하려면 SendWait를 사용합니다.

System.Windows.Forms.SendKeys.Send("A");
System.Windows.Forms.SendKeys.Send("{ENTER}");

Microsoft 의 사용 예에 대해서는, 여기를 참조해 주세요.

쉽게! (다른 사람이 이미 일을 해줬기 때문에...)

오랜 시간을 들여서 이 질문에 답한 끝에 이 코드플렉스 프로젝트 Windows Input Simulator를 발견했습니다.이 프로젝트를 통해 키 누르기를 시뮬레이트할 수 있습니다.

  1. NuGet 패키지 매니저 또는 패키지 매니저 콘솔에서 다음과 같이 패키지를 설치합니다.

    설치 패키지 입력 시뮬레이터

  2. 다음 두 줄의 코드를 사용합니다.

    inputSimulator = new InputSimulator() inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)

바로 그거야!

-------------------------

Codeplex의 프로젝트 페이지에 어떤 이유로 플래그가 표시되어 있습니다.이것은 NuGet 갤러리에 대한 링크입니다.

WM_KEYDOWN을 송신하는 Windows SendMessage API.

언급URL : https://stackoverflow.com/questions/1645815/how-can-i-programmatically-generate-keypress-events-in-c

반응형