2009-05-07 6 views
0

실행중인 특정 응용 프로그램의 자식 창으로 처리기를 가져와야합니다. 주 창 핸들러가 있지만 SendMessage/PostMessage를 사용하려면 어떤 특정 하위 창이 활성 상태인지 알아야합니다.초점이 맞지 않은 응용 프로그램의 활성 ChildWindow를 얻는 방법?

드디어 파이어 폭스를 사용하여,이 다음 코드를 사용하여이 작업을 수행하기 위해 관리 : 이것은 아주 잘 작동

[DllImport("user32.dll")] 
    static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); 

    [DllImport("user32.dll", EntryPoint = "GetGUIThreadInfo")] 
    internal static extern bool GetGUIThreadInfo(uint idThread, out GUITHREADINFO threadInfo); 


    private void button1_Click(object sender, EventArgs e) 
    { 
     //start firefox 
     firefox = new Process(); 
     firefox.StartInfo.FileName = @"C:\Program Files\Mozilla Firefox\firefox.exe"; 
     firefox.Start(); 
     Thread.Sleep(10000); 

     // get thread of the main window handle of the process 
     var threadId = GetWindowThreadProcessId(firefox.MainWindowHandle, IntPtr.Zero); 

     // get gui info 
     var info = new GUITHREADINFO(); 
     info.cbSize = (uint)Marshal.SizeOf(info); 
     if (!GetGUIThreadInfo(threadId, out info)) 
      throw new Win32Exception(); 


     // send the letter W to the active window 
     PostMessage(info.hwndActive, WM_KEYDOWN, (IntPtr)Keys.W, IntPtr.Zero); 

    } 

! 그러나 응용 프로그램이 활성화되어 있지 않은 경우 (예 : 메모장에서 firefox를 덮고있는 경우) GUIThreadInfo에는 모든 멤버가 null로 제공됩니다. 파이어 폭스가 윈도우의 최상위 (활성) 애플리케이션 인 경우에만 구조체가 채워질 것입니다.

전경에서 파이어 폭스를 가져 와서이 문제를 해결할 수 있지만이 작업을 피할 필요가 있음을 알고 있습니다. 누구든지 Windows에서 최상위 창이 아닌 응용 프로그램의 활성 하위 창을 가져 오는 다른 아이디어가 있습니까? 이 과정에 대한 최상위 창 핸들이있는 경우

감사

답변

1

, 당신은 Z 순서의 맨 위에있는 창을받을 GetTopWindow을 사용할 수 있어야합니다. 이것은 응용 프로그램이 활성/현재 응용 프로그램으로 설정된 경우 활성화 될 창이어야합니다.


편집 :

어떤 다른 프로세스 스레드에 스레드를 첨부 AttachThreadInput 사용에 대한?

일단 그렇게하면 GetFocus() 및 PostMessage()/SendMessage()가 작동합니다. 입력이 완료되면 입력을 분리하십시오.

The only sample I can find of this은 불행히도 Delphi에서 불행히도 쉽게 번역 할 수 있습니다.

+0

가 항상 동일한 핸들러를 반환에 초점이 구글 페이지의 검색 상자 또는 자식 창으로 자식 창에있는 경우, 문제가되지 않는 점에 유의 주소 표시 줄 – Noyoudont

+0

나는 그 이유는 파이어 폭스의 mainWindow는 하나의 아이가 있다고 생각합니다. 이 자식은 검색 주소창의 위치입니다. 그러나이 아이는 또한 아이가 있으며, 그것이 바로 구글 페이지입니다. 그래서 GetTopWindow가 작동하지 않는다고 생각합니다. 부모 창 (예 : 손자 등)의 하위를 검사하므로 항상 동일한 처리기를 반환합니다. – Noyoudont

+0

@Noyoudont : 샘플의 접근법을 참조하십시오. 위. AttachThreadInput을 사용하여이 문제를 해결하고 훨씬 더 안정적인 접근 방법입니다. 이것을 C#으로 번역해야한다면, 알려주세요. –