2009. 10. 11. 21:10

WaitForInputIdle 함수

DWORD WaitForInputIdle( HANDLE hProcess, DWORD dwMilliseconds );

hProcess 가 가리키는 프로세스의 첫 번째 윈도우를 생성한 스레드가 대기 상태가 될 때까지 WaitForInputIdle 함수를 호출한 스레드를 대기 상태로 유지한다. 이 함수는 Parent 프로세스가 CreateProcess 를 호출하여 차일드 프로세스의 생성을 요청한 후 차일드 프로세스가 완전히 초기화될 때까지 대기하도록 하고 싶은 경우에 유용하게 사용될 수 있다. 예를 들어 Parent 프로세스의 스레드가 차일드 프로세스가 생성한 윈도우 핸들을 얻어오려면 언제 차일드 프로세스가 초기화를 완료하고 더 이상 처리할 입력이 없는지를 알아야 한다. 이를 위해 Parent 프로세스는 CreateProcess 를 호출한 이후에 WaitforInputIdle 함수를 호출하면 된다.

WaitForInputIdle 함수는 애플리케이션에 키 입력을 전송해야 할 필요가 있을 경우에도 유용하게 사용될 수 있다. 애플리케이션의 주 윈도우에 다음과 같은 일련의 메시지들을 Post 해야 할 경우를 생각해 보자.

WM_KEYDOWN
VK_MENU 가상 키 값을 인자로 함
WM_KEYDOWN
VK_F 가상 키 값을 인자로 함
WM_KEYUP
VK_F 가상 키 값을 인자로 함
 WM_KEYUP VK_MENU 가상 키 값을 인자로 함
 WM_KEYDOWN VK_O 가상 키 값을 인자로 함
 WM_KEYUP VK_O 가상 키 값을 인자로 함


대부분의 영어 기반 애플리케이션에서는 Alt+F, O 를 누르면 파일 메뉴의 열기 명령이 수행된다. 이러한 명령을 수행하면 보통 열기 다이얼로그 박스가 나타나는데, 이를 위해 윈도우는 다이얼로그 박스의 구조를 표현하고 있는 파일을 읽고 다이얼로그 박스 내의 각 컨트롤을 생성하기 위해 CreateWindow를 반복적으로 호출해야 한다. 이러한 과정은 상당한 시간을 소요하게 된다. 따라서 특정 애플리케이션에 WM_KEY 메시지를 포스트하려는 경우에는 WaitForInputIdle 함수를 호출하여 다이얼로그 박스가 완전히 생성되고 사용자 입력을 기다리는 상황이 될 때까지 대기해야 한다. 이후에 키 입력 메시지를 다이얼로그 박스에 전송해야만 수행하고자 하는 작업을 정확히 수행할 수 있다.

16비트 윈도우 애플리케이션을 개발하는 개발자의 경우 종종 이러한 문제를 겪게 될 것이다. 애플리케이션 메시지를 윈도우에 포스트하는 경우 언제 메시지가 처리되어 윈도우가 생성되고 메시지를 받아들일 준비가 될런지 알아내기가 쉽지 않다. 이 경우 WaitForInputIdle 함수를 사용하면 된다.

출처 : 제프리 리처의 Windows via C/c++