這個技術現在已經封裝成DLL免費開放給大家使用了,詳情請加群221487171
可以訪問官方網站下載 http://www.guihelper.com/
主要技術(Microsoft Active Accessibility)講解:
以下是微軟對於此技術的說明
Microsoft Active Accessibility
Version 2.0
Purpose
Microsoft® Active Accessibility® 2.0 is a COM-based technology that improves the way accessibility aids work with applications running on Microsoft Windows®. It provides dynamic-link libraries that are incorporated into the operating system as well as a COM interface and application programming elements that provide reliable methods for exposing information about user interface elements.
For a copy of the Active Accessibility SDK documentation formatted in Microsoft Word or WinHelp, see the Accessibility home page on MSDN.
Where Applicable
By using Active Accessibility and following accessible design practices, developers can make applications running on Windows more accessible to many people with vision, hearing, or motion disabilities.
Developer Audience
Active Accessibility is designed primarily for C, C++, and Microsoft Visual Basic® developers. In general, developers need a moderate level of understanding about COM objects and interfaces as well as about Unicode.
Run-Time Requirements
Full support for Active Accessibility 2.0 is built into the Windows XP and Windows Server 2003 operating systems. Active Accessibility 2.0 also supports Microsoft Windows NT® 4.0 with Service Pack 6 and Windows 98.
MSAA的全稱是Microsoft Active Accessibility。這是類似DCOM技術。技術模型是這樣的,UI程序可以暴露出一個Interface,方便另一個程序對其進行控制。 MSAA技術的初衷是為了方便殘疾人使用Windows 程序。比如盲人看不到窗口,但是盲人可以通過一個USB讀屏器連接到電腦上, 讀屏器通過UI程序暴露出來的這個Interface,就可以獲取程序信息,通過盲文或者其它形式傳遞給盲人。MSAA提供了如此方便的功能, UI自動化測試自然可以借用這項技術。MSAA暴露出來的Interface叫做IAccessible。測試程序和目標UI程序互操作流程如下:
1. 測試程序調用Windows API: AccessibleObjectFromWindow,傳入目標UI程序HWND。
2. AccessibleObjectFromWindow函數向UI程序發送WM_GETOBJECT消息。
3. UI程序創建實現了IAccessible的內部類,然后通過LresultFromObject API把IAccessible 接口返回給測試程序。
4. 測試程序拿到IAccessible接口,開始調用IAccessible接口函數操作測試目標。
IAccessible接口里面的幾個關鍵函數是:
IAccessible.get_accChild/ IAccessible.get_accParent通過這兩個函數,調用者可以瀏覽目標程序的窗口關系樹,定位到UI元素。
IAccessible.accLocation/I Accessible.accHitTest讀取和分辨目標元素的屏幕位置。
IAccessible.accName/ I Accessible.accSelect讀取元素的名字,對UI元素進行指定的操作,比如選取Listbox里面的某一項等等。
IAccessible.accValue 開發人員可以自定義value屬性的實現。比如針對折線圖控件,開發人員可以在accValue中返回折線的坐標數列。
MSAA的理念 類似於test hook。 通過主動讓UI程序暴露一個接口來讓調用者控制。 在具體使用中,測試人員往往是結合MSAA和Win32 API操作,取長補短。一方面對於UI元素豐富的屬性,比如style,鈎選狀態,是否最大化和模擬用戶輸入等,繼續采用Win32 API。 另一方面用MSAA的優勢來彌補Win32 API的一些不足,比如:
由於MSAA有自己的get_accChild方法,使其控件樹關系並不一定要和Win32 HWNDd關系對應一致。對於自繪窗口,雖然說只有一個HWND, 但是開發人員可以通過實現IAccessible接口來實現邏輯上的層次關系。比如Excel中就可以通過IAccessible把多個cell的子 IAccessible接口暴露給調用者。
IAccessible的實現是由開發者提供, 開發者可以靈活地根據實際情況決定方法的實現。比如前面提到了折線圖控件可以返回坐標數列。對於.NET WinForm, 微軟在Framework中就提供了IAccessible的默認實現,這樣在具體實現中,就可以處理.NET動態維護HWND的細節。
可見這個接口主要是用於軟件測試和實現特殊的UI需求所用的 , 了解到這個技術之后我就想QQ會不會也使用了這個技術實現軟件的測試呢 ?
結果是肯定的 , QQ的GUI也使用了這個接口 , 所以我們可以通過這個接口獲取QQ窗口內部的信息 , 而且信息很全面 , 好在.NET中已經封裝好了這一接口使得這一編程過程變得比較容易 , IAccessible接口在Accessibility命名空間下
實現窗口信息的獲取需要配合oleacc.dll中提供的API來進行操作 , 下面是使用到的主要的API函數名
1 public static extern int AccessibleChildren( 2 IAccessible paccContainer, 3 int iChildStart, 4 int cChildren, 5 [Out()] [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 4)] object[] rgvarChildren, 6 ref int pcObtained); 7 8 internal static extern int AccessibleObjectFromWindow( 9 IntPtr hwnd, 10 uint id, 11 ref Guid iid, 12 [In, Out, MarshalAs(UnmanagedType.IUnknown)] ref object ppvObject); 13 14 public static extern uint WindowFromAccessibleObject(IAccessible pacc, ref IntPtr phwnd);
轉載請注明出處 : 文章來自博客園SadlyCodes的博客 http://www.cnblogs.com/SadlyCodes
希望大家可以通過這篇文章了解到更多的關於IAccessible接口的知識
最后附一張我的測試DEMO圖:
為了防止盜圖我加上了我自己的水印 如果違規請通知我 我會立即更改 謝謝