2016-10-29 4 views
2

우리는 keybd_event를 사용하여 리턴 키 이벤트를 활성 창에 전송/시뮬레이트하는 간단한 C++ 프로그램을 보유하고 있습니다.Windows의 모든 종류의 응용 프로그램에 키보드 이벤트를 보내는 방법은 무엇입니까?

keybd_event(VK_RETURN, 0x1c, 0, 0); 

모든 종류의 Windows 응용 프로그램에서 정상적으로 작동합니다. 그러나 GTA (게임)와 같은 타사 앱에 키보드 이벤트를 보내고 싶습니다. 작동하지 않습니다. GTA는 키보드 이벤트를 수신하지 않습니다.

왜 GTA는 키보드 이벤트를받지 못합니까? keybd_event에서 작동하도록 할 수있는 방법이 있습니까? 또는 모든 종류의 응용 프로그램 (일반적인 Windows 또는 C++ 표준 라이브러리)에 이벤트를 보내는 다른 솔루션이 있습니까?

답변

2

keybd_event는 더 이상 사용되지 않는 API 호출입니다. pInputs 배열에 모더 SendInput API 함수

UINT WINAPI SendInput(
    _In_ UINT nInputs, 
    _In_ LPINPUT pInputs, 
    _In_ int  cbSize 
); 

nInputs에게 구조의 수를 사용해보십시오.

pInputsINPUT 구조체의 배열. 각 구조체는 키보드 또는 마우스 입력 스트림에 삽입 할 이벤트를 나타냅니다. INPUT 구조 바이트

cbSize 크기,. cbSizeINPUT 구조의 크기가 아니면 함수가 실패합니다.

이 기능은 UIPI의 적용을받습니다. 응용 프로그램은 무결성 수준 이하의 응용 프로그램에만 입력을 허용 할 수 있습니다.

SendInput 함수는 INPUT 구조의 이벤트를 키보드 또는 마우스 입력 스트림에 차례대로 삽입합니다. 이러한 이벤트는 사용자가 (키보드 또는 마우스) 또는 keybd_event 호출, mouse_event, 또는 SendInput 다른 호출에 의해 중 삽입 된 다른 키보드 또는 마우스 입력 이벤트 산재되어 있지 않습니다.

이 기능은 키보드의 현재 상태를 재설정하지 않습니다. 함수가 호출 될 때 이미 눌려진 키는이 함수가 생성하는 이벤트를 방해 할 수 있습니다. 이 문제를 방지하려면 GetAsyncKeyState 기능으로 키보드 상태를 확인하고 필요에 따라 수정하십시오. 터치 키보드가 시스템에 입력을 보내 winnls.h 정의 대리 매크로를 사용하므로

키보드 이벤트 리스너 후크 터치 키보드 유래 입력을 디코딩해야한다. 자세한 내용은 대리 문자 및 보조 문자를 참조하십시오.

액세스 가능성 응용 프로그램은 쉘에 의해 처리됩니다 응용 프로그램 실행 바로 가기 키에 해당하는 키 입력을 주입하는 SendInput를 사용할 수 있습니다. 이 기능은 다른 유형의 응용 프로그램에서도 작동하지 않을 수 있습니다.

1

이 API는 하위 레벨입니다. 그래서 응용 프로그램은 직접 그것에 응답하지 않습니다. 이 함수는 인터럽트 핸들러에 의해 호출됩니다. 아마도이 응용 프로그램이 응답하는 데 필요하다고 생각하는 것과 정확히 동일한 입력을 생성하지 못하는 것일 수 있습니다. 또한이 API는 현재 keybd_event 대신에 사용하는 SendInput 함수로 대체되었습니다.

관련 문제