2013-12-11 32 views
0

我正在嘗試查找給定窗口的所有子控件。我可以得到窗口的句柄,我已經使用Inspect.exe(來自Windows開發工具包)進行了驗證。問題是當我打電話FindWindowEx函數返回0(IntPtr.Zero準確),而我可以找到與Inspect.exe控件。FindWindowEx在特定應用程序上使用時返回0

這裏是我的代碼

[DllImport("user32.dll", SetLastError=true)] 
private static extern IntPtr FindWindowEx(IntPtr parentHandle, 
      IntPtr childAfter, string className, string windowTitle); 

public static List<IntPtr> EnumChildren(IntPtr hwnd) 
{ 
    IntPtr zero = IntPtr.Zero; 
    List<IntPtr> list = new List<IntPtr>(); 
    do 
    { 
     zero = FindWindowEx(hwnd, zero, null, null); // Returns 0 
     if (zero != IntPtr.Zero) 
     { 
      list.Add(zero); 
     } 
    } 
    while (zero != IntPtr.Zero); 
    return list; 
} 

我已經使用以下嘗試,它都返回0,以及:

zero = FindWindowEx(hwnd, zero, "TextBox", null); 
zero = FindWindowEx(hwnd, zero, "TextBox", "Text"); 
zero = FindWindowEx(hwnd, zero, String.Empty, String.Empty); 
zero = FindWindowEx(hwnd, zero, "TextBox", String.Empty); 

我知道有辦法找到該窗口的控件Inspect.exe是正在做。我試過使用EnumChildWindows,但得到相同的結果,例如一個空的列表。請注意,與其他軟件(我迄今爲止嘗試使用Thunderbird和KeePass)FindWindowEx函數可以正常工作,而不是與我一起工作的應用程序。

我已經使用EnumChildWindows進行了測試,以確保只有一個窗口的標題我正在尋找,它是唯一的一個。我真的無法解釋爲什麼我不能得到任何控制。

我在做什麼錯了,是否有另一種方法獲得給定窗口的所有子窗口?

+0

恩,Inspect使用輔助功能樹,而不是窗口樹。 –

+0

我打算枚舉窗口對象,事先用Spy ++檢查,而不是檢查。 – manuell

回答

2

要調用:

zero = FindWindowEx(hwnd, zero, null, null); 

這回0。既然你通過NULL兩個類名和窗口名稱,FindWindowEx考慮的hwnd所有兒童。既然你通過NULLhwndChildAfter,文檔告訴你:

如果hwndChildAfter爲NULL,則搜索hwndParent的第一個子窗口開始。

換句話說,可以得出的唯一結論是,無論是:

  1. hwnd參數是無效的,或
  2. 通過hwnd指定的窗口沒有子窗口。

現在,對於第1點,我們假設您能夠提供有效的窗口句柄。在這種情況下,唯一剩下的可能是hwnd沒有孩子。這很合理。許多GUI框架使用非窗口控件。這也符合EnumChildWindows不返回窗口的事實。

您已使用Inspect工具查看應用程序。我們來看看MSDN says about Inspect

Inspect(Inspect.exe)是一款基於Windows的工具,可讓您選擇任何UI元素並查看元素的輔助功能數據。您可以查看 Microsoft UI自動化屬性和控制模式,以及 Microsoft Active Accessibility屬性。Inspect還允許您通過 測試UI 自動化樹中的自動化元素的導航結構,以及Microsoft Active 輔助功能層次結構中的可訪問對象。

根本問題是您選擇了錯誤的工具來解決這個問題。您應該使用自動化API執行此任務,而不是使用窗口層次結構。這就是Inspect如何分解這個應用程序的控制,並且也必須這樣做。

+0

你有沒有在C#中的自動化API(尤其是UIA)的資源?我能找到的所有東西似乎都在C/C++中。 – Technoh

+0

http://www.codeproject.com/Articles/141842/Automate-your-UI-using-Microsoft-Automation-Framew –

+2

@Technoh自動化有一個完整的.NET命名空間:System.Windows.Automation。 –

相關問題