2009-05-09 7 views
4

나는 sendMessage/postMessage API 호출을 사용해야하므로 Windows의 활성 응용 프로그램이 아닌 특정 응용 프로그램에 pressKey 이벤트를 보내려고합니다.응용 프로그램의 활성 ChildWindow를 얻으려면 어떻게해야합니까?

는 그러나, 나는 ... 응용 프로그램에서 활성화되어 정확한 자식 창을 알고 그것에 pressKey 메시지를 보낼 필요가 내가 GetTopWindow 및하여 GetWindow (GW_CHILD) API는 정상 아이를 얻기 위해 호출을 사용했다

메인 윈도우의 윈도우를 열고, 얻어진 child window로 다시 최상위 grandWildowWindow를 얻고, 더 이상 childwindow가없는 childwindow를 찾을 때까지 계속합니다. 이것은 일부 응용 프로그램에서는 잘 작동하지만 어떤 경우에는 그렇지 않습니다. 때로는 부모 창은 자식 창 중 하나가 아닌 활성 창이므로 부모의 상위 자식 창을 가져 오지 않으면 잘못된 창으로 메시지를 보냅니다.

GuiThreadInfo API 호출을 사용하고 있지만 대상 응용 프로그램이 Windows에서 활성 응용 프로그램 인 경우에만 작동하는 것으로 나타났습니다 (실제 활성 창의 처리기를 가져 오는 것). 처음에 언급했듯이 핸들러가 null이되지는 않습니다.

setForegroundWindow API 호출을 사용하여 응용 프로그램을 맨 위로 가져올 수 있지만이 작업을 수행하고 싶지는 않습니다. 또한 AttachThreadInput 및 GetFocus API 호출을 시도했지만 대상 응용 프로그램이 활성 응용 프로그램 인 경우 다시 작동합니다.

아이디어가 있으십니까? 고마워요

+0

는, 당신이 '당신을 찾고 또는 얼마나하는지 그렇게 확신하지, 활성 창을 가지고 있지 않습니다 이런 식으로 안정적으로 구현하십시오. 네가하려는 것은 무엇인가? – jdigital

답변

1

당신이 당신의 메인 윈도우에 핸들을 얻는 방법을 알고 있다고 시도한 것들로부터 추측합니다. 그러나 당신이 코멘트를 남기지 않고 그것을위한 스 니펫을 게시 할 것입니다.

나는 이것을 알아 내기 위해 내가 그물에서 찾은 몇 가지 것들을 결합했지만 주된 것은 이것이다. one. 나는 이것을 시험 할 훌륭한 응용 프로그램이 없지만 간단한 경우에 작동합니다. 한 가지 예외는 응용 프로그램에서 도구 창을 사용하면 GetLastActivePopup 메서드에 해당 메서드가 포함되어 있지 않다고 (확신하지 못하고 해당 사례를 테스트하지 않았다고 생각하기 때문에) 코드화 된 코드를 찾을 수 없다는 것입니다.

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool IsWindowVisible(IntPtr hWnd); 

[DllImport("user32.dll")] 
static extern IntPtr GetLastActivePopup(IntPtr hWnd); 

[DllImport("user32.dll", ExactSpelling = true)] 
static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags); 

const uint GA_PARENT = 1; 
const uint GA_ROOT = 2; 
const uint GA_ROOTOWNER = 3; 

    public static IntPtr GetAppActiveWindow(IntPtr hwnd) 
    { 
     IntPtr activeAppWindow = IntPtr.Zero; 

     if (hwnd != IntPtr.Zero) 
     { 
      //Get the root owner window (make sure we are at the app window 
      //if you already have a handle to the main window shouldn't have 
      //to do this but I put it in just in case 
      hwnd = GetAncestor(hwnd, GA_ROOTOWNER); 

      while ((activeAppWindow = 
         GetLastActivePopup(hwnd)) != activeAppWindow) 
      { 
       if (IsWindowVisible(activeAppWindow)) 
        break; 
       hwnd = activeAppWindow; 
      } 
     } 

     return activeAppWindow; 
    } 
관련 문제