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

키보드에서 키를 누르는 것을 시뮬레이션하는 이벤트를 프로그래밍 방식으로 어떻게 만들 수 있습니까?



답변

질문에는 WPF 태그가 지정되어 있지만 지금까지 답변은 특정 WinForms 및 Win32입니다.

WPF에서이를 수행하려면 KeyEventArgs를 생성하고 대상에서 RaiseEvent를 호출하면됩니다. 예를 들어, Insert key KeyDown 이벤트를 현재 포커스가있는 요소로 보내려면 :

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보다 선행해야합니다.

  • target.RaiseEvent (…)를 사용하면 가속기, 텍스트 구성 및 IME와 같은 메타 처리없이 이벤트를 대상으로 직접 보냅니다. 이것은 일반적으로 원하는 것입니다. 반면에 어떤 이유로 실제 키보드 키를 시뮬레이션하기 위해 실제로 수행하는 경우 대신 InputManager.ProcessInput ()을 사용합니다.


답변

Windows Forms Context없이 키 이벤트를 생성하려면 다음 방법을 사용할 수 있습니다.

[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는 여기에 더 많은 사용 예가 있습니다 .


답변

용이하게! (이미 다른 누군가가 우리를 위해 일을했기 때문에 …)

제안 된 답변으로이를 시도하는 데 많은 시간을 보낸 후이 codeplex 프로젝트 Windows 입력 시뮬레이터 를 발견했습니다.이 프로젝트 는 키 누르기를 시뮬레이션하는 것처럼 간단하게 만들었습니다.

  1. 패키지를 설치하거나 NuGet 패키지 관리자 또는 다음과 같은 패키지 관리자 콘솔에서 설치할 수 있습니다.

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

  2. 다음 두 줄의 코드를 사용하십시오.

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

그리고 그게 다야!

——-편집하다——–

코드 플렉스에 프로젝트 페이지는 어떤 이유로 판정을 받았습니다 NuGet 갤러리에 대한 링크입니다.


답변


답변