2009-05-09 13 views
4

私はsendMessage/postMessage APIコールを使用する必要があるので、アクティブなアプリケーションではない特定のアプリケーションにpressKeyイベントを送信します。アプリケーションのアクティブなChildWindowを取得するにはどうすればよいですか?

しかし、私はGetTopWindowとは、GetWindow(GW_CHILD)APIを使用していた

...アプリケーションでアクティブで、それにpressKeyメッセージを送信し、正確な子ウィンドウを知っておく必要がありますが、トップの子供を取得するために呼び出しますメインウインドウのウインドウを開き、得られた子ウインドウでもう一度やって、トップgrandchildWindowを取得し、子ウインドウがなくなるまでそれを続けます。これは一部のアプリケーションでは効果的ですが、場合によってはそうではありません。親ウィンドウが子ウィンドウの1つではなく、アクティブウィンドウである場合があります。親ウィンドウの子ウィンドウを取得すると、間違ったウィンドウにメッセージが送信されます。

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; 
    } 
関連する問題