2009-08-03 4 views
18

        나는 이미 활성화 된 창으로 명령을 보내는 응용 프로그램을 만들었습니다. 다른 창으로 포커스를 옮기 자마자 보내기 키를 통해 전송되는 키 스트로크가 방금 전환 한 창으로 이동하기 때문에 프로세스가 실행되는 동안 컴퓨터를 사용할 수 있기를 원합니다.Windows API를 사용하여 키 스트로크를 활성화하지 않고 창에 키 스트로크를 보내려면 어떻게해야합니까?

        현재 Windows API의 FindWindow, IsIconic 및 ShowWindow를 사용합니다. 창에 FindWindow가 있는지 확인하고 그 개체가 해당 호출과 함께 반환되는 특정 창에 설정되어 있는지 확인한 다음 IsIconic으로 최소화되어 있는지 확인한 다음 ShowWindow를 호출하고 마침내 호출해야합니다. Interaction.AppActivate를 클릭하여 해당 창으로 포커스를 설정합니다. 이 모든 것은 키 스트로크를 전송하기 전에 완료됩니다. 창을 표시하고 활성화하지 않고 키 스트로크를 전송하는 방법이 있어야하는 것처럼 보입니다. 중요한 것은 내 응용 프로그램이 키 스트로크를 실행하는 동안 내 컴퓨터에서 아무 것도 할 수 없다는 것입니다.

+0

사용중인 OS는 무엇입니까? –

+0

Windows Vista를 사용하고 있습니다. 또한 C#에서 Visual Studio 2008과 함께 .NET 3.5 SP1 프레임 워크를 사용하고 있습니다. – SlipToFall

+0

활성 창 이외의 다른 곳으로 키보드 입력을 보낼 수없는 좋은 이유가 있습니다. 그들은 일종의 미묘하지만 그것들은 거기에 있습니다. –

답변

24

좋아, 이것은 실망 스럽지만 근본적으로 은 신뢰할 수있는을 근본적으로 수행 할 수 없습니다.

활성 창은 키보드 입력을받는 창인 것으로 가정합니다. 키보드 입력을 가짜로 만드는 올바른 방법은 SendInput이며, 활성 창에만 메시지를 보냅니다. 말했다되고 그건

을 수행 할 수 있습니다 SendMessageWM_KEYUP, WM_CHARWM_KEYDOWN 메시지와 아마 도망가 (를 수신의 WndProc에 따라 다름). 그러나 특정 상황 하에서는 going to break을 기억하십시오.

6

keybd_event() 또는 SendInput()을 사용하는 것처럼 들리지만 둘 다 현재 활성 창으로 키 입력을 보냅니다. 해당 창에 초점이 맞았는지 여부에 관계없이 키 입력을 특정 창으로 보내려면 먼저 해당 HWND 핸들을 찾아 적절한 형식의 WM_KEYUP/DOWN 및 WM_CHAR 메시지를 직접 게시해야합니다.

0

일단 Windows HWND가 있으면 메시지 대기열에 WM_KEYDOWN 및 WM_KEYUP 메시지를 직접 SendMessage() 할 수 있습니다. 창을 활성화 할 필요는 없습니다.

그러나 대상 응용 프로그램이 키보드 입력을 처리하는 방법에 따라 달라집니다. 여러 가지 방법으로 처리 할 수 ​​있습니다.

WM_KEYUP/WM_KEYDOWN이 가장 일반적이며 일부 응용 프로그램은 둘 중 하나만 처리합니다 (일반적으로 WM_KEYDOWN).

WM_CHAR는

일부 프로그램은 GetAsyncKeyState, GetKeyState, 또는 GetKeyboardState를 사용 또한 매우 일반적이다. 이는 매우 드문 일이지만 SendMessage()를 사용하여 키 누르기를 효과적으로 방지합니다. 이 경우 키보드 드라이버가 직접 처리하는 keybd_event()로 돌아갑니다. 물론 창이 활성 상태 여야합니다.

관련 문제