키보드에서 키를 누르는 것을 시뮬레이션하는 이벤트를 프로그래밍 방식으로 어떻게 만들 수 있습니까?
키보드에서 키를 누르는 것을 시뮬레이션하는 이벤트를 프로그래밍 방식으로 어떻게 만들 수 있습니까?
답변:
질문에는 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 ()을 사용합니다.
Keyboard.PrimaryDevice.ActiveSource
참조 stackoverflow.com/questions/10820990/...을
Ctrl+C
)
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}");
용이하게! (이미 다른 누군가가 우리를 위해 일을했기 때문에 ...)
제안 된 답변으로이를 시도하는 데 많은 시간을 보낸 후이 codeplex 프로젝트 Windows 입력 시뮬레이터 를 발견했습니다.이 프로젝트 는 키 누르기를 시뮬레이션하는 것처럼 간단하게 만들었습니다.
패키지를 설치하거나 NuGet 패키지 관리자 또는 다음과 같은 패키지 관리자 콘솔에서 설치할 수 있습니다.
설치 패키지 입력 시뮬레이터
다음 두 줄의 코드를 사용하십시오.
inputSimulator = new InputSimulator()
inputSimulator.Keyboard.KeyDown(VirtualKeyCode.RETURN)
그리고 그게 다야!
-------편집하다--------
코드 플렉스에 프로젝트 페이지는 어떤 이유로 판정을 받았습니다 이 NuGet 갤러리에 대한 링크입니다.
send WM_KEYDOWN이있는 Windows SendMessage API .