2009-04-17 10 views
1

나는 다양한 User32.dll 라이브러리 호출을 사용하여 열려있는 응용 프로그램 창을 임의로 클릭하는 자동화 된 테스트를위한 프로그램을 코딩하고 있습니다. 내 현재 문제는 클릭 한 번으로 대화 상자가 열리면 Process.WaitForInputIdle()을 사용하여 루프 주위의 다음 대화를 감지 할 수있을 때까지 기다리지 않고 몇 번의 클릭이 신호를 받으면 해당 클릭이 발생했는지를 나타냅니다. 대화 상자에서 뭔가를하고 싶습니다 (나가기 버튼과 같은)를 피하고 싶으면 미리 말할 방법이 없습니다. 내 질문은 이것이다. 프로세스 또는 스레드가 모든 처리를 끝내고 메시지 루프에서 다시 만 기다리는 방법이 있습니까?자동 클릭 문제

나는 의미가 있기를 바랍니다.

건배

로스, prioritorys을 프로세스가/모두 대상 프로그램의 스레드 내 프로그램은 동일한 프로세서를 사용하여 설정하고 조정하기 위해 어떻게 든 가능한 것이 실패

편집

목표 프로그램이 선호도를 얻도록 각각의

답변

0

이 방법을 사용하는 방법은 mouse_event 또는 SendInput API 대신 SendMessage API를 사용하는 것입니다. 그 이유는 SendMessage가 처리 될 때까지 차단하기 때문입니다. 그냥 (WindowFromPoint를 사용하여) 클릭하고 ScreenToClient를 사용하여 화면에서 클라이언트 좌표로 마우스 좌표를 변환하려는 곳에서 항상 창의 핸들을 항상 얻도록하십시오. ((pt.Y < < 16) + pt.X)를 사용하여 좌표를 lParam 매개 변수에 압축합니다. 처리 될 때까지 차단되어 표시되는 모든 모달 대화 상자가이 호출을 차단합니다.

+0

이 방법은 보낸 메시지에 대한 응답이 기껏해야 일치하지 않는다는 단점이 있습니다. 예를 들어 WM_NCLBUTTONDOWN/UP으로이 메소드를 사용하여 메모장에서 파일 메뉴를 클릭하면 실제로 메뉴를 표시하지 않고 메뉴 루프를 시작한 다음 immediatly 종료합니다. – Ross

1

WaitForInputIdle은 대기중인 입력 메시지가없는 응용 프로그램이 메시지 루프에있는 즉시 반환합니다.

대화 상자의 코드를 소유하고 있다면 테스트 할 준비가되었음을 사용자의 자동화에 알리기 위해 대화 상자에 SetEvent를 WM_INITDIALOG에 호출 할 수 있습니다. 또는 프로세스에서 SetWinEventHook을 사용하여 입력 이벤트를 보내기 전에 대화 상자가 실제로 생성 될 때까지 기다릴 수 있습니다.

+0

귀하의 의견을 보내 주셔서 감사합니다. 쓰고있는 프로그램은 특정 프로그램이 아니라 상당히 일반적인 원숭이 테스터를위한 것입니다. 따라서 대화가 어떤 조치의 결과로 나타나는지 미리 알 수 없습니다. 유휴 상태에있는 프로세스를 감지 할 수있는 고리가 있으면 이상적입니다. – Ross