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


107

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


6
이벤트가 발생하기 만하면됩니까?
Daniel A. White

'실제'키 누르기를 시뮬레이션하려면 관리되지 않는 코드로 들어가야한다고 생각합니다.
Jonas B

예, 이벤트를 시작하면됩니다.
Dan Vogel

1
@GONeale :와, 3 년 된 댓글입니다. 자 그리고 나서. 예, 이것에 대한 유효한 용도가 있으므로 API가 처음에 존재하는 이유입니다. 그러나 그들은 소수이며 그 사이에 있습니다. 내 경험상 많은 사람들이 문제를 해결하는 가장 좋은 방법을 잘 이해하지 못하기 때문에 이렇게합니다. 따라서 초보자에게는 버튼 클릭을 시뮬레이션하는 것이 논리적으로 보입니다. 실제로해야 할 일은 해당 코드를 가져 와서 함수에 던져 넣고 코드의 다른 곳에서 호출하는 것입니다.
Ed S.

6
@EdS : 질문은 꽤나 예뻤습니다. 키패드를 만드는 것에 대해 많은 세부 사항을 추가 할 수 있었지만 여전히 같은 대답을 얻었습니다. 내가 필요한 것을 정확히 얻었음을 고려할 때 그것은 나에게 "저질"질문처럼 보이지 않습니다.
Dan Vogel 2012 년

답변:


147

질문에는 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 ()을 사용합니다.


1
귀하의 제안을 시도했지만 아무런 효과가 없습니다. 포커스가있는 요소에 keyDown 이벤트 처리기를 연결했습니다. 내가 제기 한 이벤트가 수신되었지만 KeyState는 None, ScanCode는 0, isDown은 false입니다. 나는 이것이 키보드의 실제 상태이기 때문에 이러한 값을 얻고 있다고 가정합니다. 실제 키보드에서 키를 누르면 KeyState = Down, isDown = true 및 ScanCode에 값이 있습니다.
Dan Vogel

25
keydown의 첫 번째 코드를 시도했을 때 "target"에 오류가 발생하여 시각적으로 변환 할 수없는 이유는 무엇입니까?
kartal 2010-08-26

3
Dan, 수정 자 (ctrl / alt / shift)로 키를 누르는 방법을 알고 있습니까? 특히 InputBinding : m_shell.InputBindings.Add (new KeyBinding (m_command, Key.Insert, ModifierKeys.Control | ModifierKeys.Alt));를 시뮬레이션해야합니다.
Shrike

14
[정보] 대상 문제, 내가 사용하여 그것을 밖으로 일을 Keyboard.PrimaryDevice.ActiveSource참조 stackoverflow.com/questions/10820990/...을
OscarRyz

4
이 대답은 매우 좋지만 @Shrike가 지적했듯이 수정 자와 함께 키를 보내는 데 사용할 수 없습니다. (예 Ctrl+C)
ANeves

27

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


창문이 맨 위에 있으면 적합합니다. 내 상황을 부분적으로 해결했습니다. 감사합니다!
Sergey

모바일 플랫폼에서이 작업을 수행하려면 인 Rajesh의 대답에 추가, 당신은 "coredll.ddl"를 가져와야합니다
user1123236

21

나는 그것을 사용 하지 않았지만 SendKeys 는 당신이 원하는 것을 할 수 있습니다.

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

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

Microsoft는 여기에 더 많은 사용 예가 있습니다 .


3
SendKeys.Send를 사용해 보았는데 InvalidOperationException이 발생했습니다. "응용 프로그램이 Windows 메시지를 처리하지 않기 때문에이 응용 프로그램 내에서 SendKeys를 실행할 수 없습니다. 메시지를 처리하도록 응용 프로그램을 변경하거나 SendKeys.SendWait 메서드를 사용하십시오." SendKey.SendWait를 사용해도 효과가 없습니다.
Dan Vogel

키 이벤트를 자신에게 보내지 않는지 확인하십시오. 이벤트를 보내기 전에 적절한 프로세스로 초점을 전환하십시오. 두 번째 링크 된 기사에는 이에 대한 도움이 있습니다.
Michael Petrotta

11

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

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

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

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

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

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

그리고 그게 다야!

-------편집하다--------

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


이것은 매우 잘 작동하지만 키 조합으로이 작업을 수행하는 방법을 찾지 못했습니다.
user1234433222

키 조합을 말할 때 CTRL-C와 같은 의미입니까?
Ravid Goldenberg 2016 년

예 또는 Alt-Enter와 같은 콘솔 응용 프로그램을 전체 화면으로 전환하려는 경우에도 F11을 사용하여 전체 화면으로 들어갈 수 있지만 Alt-Enter가 작동하는지 확인하는 것이 좋습니다. :)
user1234433222

1
시도 해본 적은 없지만 inputSimulator.Keyboard.ModifiedKeyStroke (VirtualKeyCode.CONTROL, VirtualKeyCode.VK_C);
Ravid Goldenberg 2016 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.