2009-05-04 8 views
13

私は別のアプリケーションのmainWindowhandleを与えたアプリケーションを構築しています。これは、ウィンドウの状態に関する情報を収集します。子ウィンドウに関する情報の収集には問題はありませんが、アプリケーションの開いている他のウィンドウやメニューにはアクセスできません。アプリケーションのすべてのウィンドウハンドルを取得する方法はありますか?アプリケーションのウィンドウハンドルを取得

+0

チェックアウトこの作業溶液:http://stackoverflow.com/a/28055461/1274092 –

答えて

15

Process.MainWindowHandleが表示されます:P/Invokeを使用してEnumWindows関数を呼び出すことができます。この関数は、システムのトップレベルウィンドウごとにコールバックメソッドを呼び出します。

コールバックでは、GetWindowThreadProcessIdと呼び出し、ウィンドウのプロセスIDとProcess.Idを比較してください。プロセスIDが一致する場合は、ウィンドウハンドルをリストに追加します。

8

まず、アプリケーションのメインウィンドウのウィンドウハンドルを取得する必要があります。

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam); 

private List<IntPtr> GetChildWindows(IntPtr parent) 
{ 
    List<IntPtr> result = new List<IntPtr>(); 
    GCHandle listHandle = GCHandle.Alloc(result); 
    try 
    { 
     EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
     EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
    } 
    finally 
    { 
     if (listHandle.IsAllocated) 
       listHandle.Free(); 
    } 
    return result; 
} 
+0

MEZ問題のISN」を

[DllImport("user32.dll", SetLastError = true)] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); IntPtr hWnd = (IntPtr)FindWindow(windowName, null); 

その後、あなたはすべてのchildwindowsを取得するには、このハンドルを使用することができます子ウィンドウを取得すると、私はそれを簡単に行うことができますが、私は何もできませんmainWindowとその子のほかの他のウィンドウに移動することです... – user361526

+0

これは、任意のウィンドウでも、独自のアプリケーションに属していないウィンドウ。申し訳ありませんが、私はあなたの質問を誤解した場合。 – Mez

+0

どこから 'EnumWindowProc'が来ますか? –

関連する問題