2010-03-26 8 views
1

현재 Focussed Window 용 HWND 및 ThreadID를 얻으려고합니다.GetGuiThreadInfo()는 어떻게 작동합니까?

일반적으로 GetForegroundWindow()를 호출 한 다음 GetThreadProcessId()를 호출하면 정확한 정보를 얻을 수 있습니다.

IE8의 경우 HWnd GetForegroundwindow()는 IE 프레임의 HWND를 제공하지만 실제로 포커스 된 윈도우 (문서 객체 또는 Internet Explorer_server)는 다릅니다 (다른 프로세스에서 실행 중임). 따라서 GetForegroundWindow() 접근 방식은 작동하지 않습니다.

그래서 GetGuiThreadInfo (DWORD tid)를 사용하여 GetForegroundWindow에서 얻은 threadId를 전달했습니다.

DWORD tid = GetWindowThreadProcessId(GetForegroundWindow(),0); 
GetGuiThreadInfo(tid,&guiThreadInfoObject); 
HWND focus = guiThreadInfoObject.hwndFocus; 

위의 방법을 사용하면 올바른 Internet Explorer_server 개체에 대한 올바른 HWND를 얻을 수 있습니다. 그러나 GetGuiThreadInfo()가 IE 프레임 인 다른 프로세스에서 스레드의 ThreadId를 가져오고 있다고해도, 나에게 다른 프로세스와 스레드에있는 Internet Explorer_server 개체에 대한 threadinfo를 얻을 수있는 방법이 무엇인지 이해할 수 있습니까?

감사

답변

0

GetWindowThreadProcessId 창 (귀하의 경우 전경에) 생성 된 스레드 ID를 검색합니다.
guiThreadInfoObject.hwndFocus은 포커스를 입력하는 창입니다.

여기에 약간의 여유가 있습니다. 전경 창이 입력 포커스가있는 곳이라고 특별히 명시하지 않은 곳은 없습니다. (어쩌면 최상위 수준의 상위/소유자를 검색 할 수 있습니까?).

또한 AttachThreadInput은 스레드 입력 포커스를 다른 프로세스의 창으로 설정하여 게임을 약간 변경할 수 있습니다.

어쨌든 명확하게 말한 것이 아니기 때문에 나는 그 행동에 많은 시간을 할애하지 않을 것입니다. 이것은 많은 시스템에서 테스트하고 가능한 경우 개선해야 할 약점으로이 메소드를 처리한다는 것을 의미합니다.

+0

감사합니다. 지금 올바른 결과를 얻고 있습니다. 항상 그렇다는 뜻입니까? 이것은 GetGUIThreadInfo() 메서드의 예상되는 동작인지, IE8과 같은 다른 모든 응용 프로그램에서도 동일하게 동작하는지 확인하고 싶습니다. – Prakash

+0

내가 말했듯이, 그것은 의미가 있지만, 명시 적으로 문서에 언급되어 있지 않습니다. – peterchen

2

GetFocus()를 사용하면 포커스가있는 창을 쉽게 가져올 수 있습니다. GetGuiThreadInfo()는 창 관리자의 내부 데이터를 사용한다고 생각합니다. IE가 최소화되었거나 포커스가 없다면 귀하의 접근 방법은 실패 할 것입니다.

GetClassName() 호출이 "Internet Explorer_Server"를 반환하는 창이 나타날 때까지 EnumChildWindows()를 반복적으로 사용하십시오.

btw를 가져 주셔서 감사합니다. IE가하는 일은 SetParent()의 문서에서 명시 적으로 금지되어 있습니다. 나는이 규칙을 어기는 Acrobat 만 알고 있었지만 이제는 Microsoft 프로그램에서이 작업을 수행했다는 증거를 제공했습니다. 그걸 정착 시키면 더 이상 규칙이 아닙니다!

+0

고맙지 만 GetFocus()는 포커스가있는 창이 다른 스레드에 있으면 항상 0을 반환합니다. 그리고 응용 프로그램은 아무것도 될 수 있습니다 ..IE8은 그 중 하나 일뿐입니다. 그래서 나는 Internet Explorer_server를 찾기 위해 EnumChildWindows()를 사용할 수 없기 때문에 일반적인 것을 원한다. – Prakash

+1

"Something generic"은 의미가 없습니다.다른 프로세스의 창을 엉망으로 만들고 싶다면 코드를 사용자 정의하여 특정 프로세스와 구현 세부 사항을 처리해야합니다. –