2010-02-03 3 views
1

대화 상자가 열리 자마자 핸들을 찾으려고합니다.FindWindowEx가 창 핸들을 찾을 수 없습니다.

이제 대화 상자가 열리면 별도의 스레드에서 해당 대화 상자에 대해 FindWindowEx를 호출하려고하지만 NULL을 반환합니다.

그런 다음 FindWindowEx를 호출하기 전에 잠자기를합니다. 수면을 취한 후 잠시 작동합니다.

대화 상자가 만들어지기 전에 FindWindowEx가 호출되고 잠자기가 대화 상자를 만드는 데 도움이되어 일부 기능이 작동하는 것처럼 보입니다.

이제 임의의 값을 잠자기에 넣었습니다. 그리고 그것은 언제든지 실패 할 수 있기 때문에 좋은 접근법이 아닙니다.

스레드를 잠자기 상태로 만들지 않고 FindWindowEx를 통해 매번 처리 할 수있는 완전한 증거 접근법이 있습니까?

+1

언제/백그라운드 스레드가 FindWindowEx를 호출할지 알려주는 경우 - 두 스레드 간의 경쟁 상태 일 수 있습니까? – Ruddy

+0

예 - '열리는대로'라는 의미를 알려 주시기 바랍니다. 대화 상자가 실제로 생성되기 전에'FindWindowEx()'를 호출하는 것처럼 보입니다. 그래서 대화 상자를 찾을시기를 알려주는 더 좋은 방법이 있습니다. –

답변

1

매우 간단한 해결책은 FindWindowEx을 반복적으로 호출하는 것입니다.

HWND h = NULL; 
while (1) { 
     h = FindWindowEx(...); 
     if (h) { 
     break; 
     } 
     Sleep(100); 
    } 

그건 아니에요 방탄 - 그것은 대화 느 베르 열리면 무한 루프, 또는 (즉 같지도 않지만) 너무 빨리 닫혀 있습니다. 두 경우를 잡으려면 대화 상자를 만들고 실행하는 기본 스레드가 작업자 스레드가 여전히 대화 상자가 있는지 여부를 확인하기 위해 쿼리하는 간단한 bool 속성을 유지하게하십시오.

+0

downvotwer가 나에게 * 왜 * 그가 나쁜 대답이라고 생각하는지 말하면 매우 좋을 것입니다. 그것은 간단하고 후킹하지 않고 문제를 해결합니다. (물론, OP는 그가자는 것을 원하지 않는다고 말하지만, 나는 그가 그가 말하는 한 번의 임의의 수면 통화를 의미한다고 생각합니다.) –

2

원하는 대화 상자가 대화 상자 (즉, 코드를 제어하는 ​​경우) 인 경우 대화 상자에서 "아, 안녕하세요!"라는 시청 앱으로 메시지를 보낼 수 있습니다.

대화 상자가 사용자가 아니며 스핀을 원하지 않는 경우 WM_CREATE 메시지에서 create a Windows hook을 입력 할 수 있습니다.