因为 IAccessible 接口的数量比窗口要多(因为大多数--但不是全部--COMCTL32 控件都有被 OLEACC.DLL 支持的 IAccessible 接口。),使用 Win32 函数来搜索一个窗口将会比使用 Active Accessibility 树搜索与该窗口相应的 IAccessible 接口要占用少得多的时间。这就意味着为了提高性能,你应该使用 FindWindow 和 EnumWindows 这样的 Win32 函数来找到与希望的UI元素最接近的窗口。当然,在权衡 Win32 函数和 Active Accessibility 函数时,上面的规则只是使用它们的一般标准而不能盲目的遵照执行,重要的是理解它们的本来意义。
下面结合代码介绍一下它的用法。
我们来得到下面运行窗口的 IAccessible 接口指针。
图一
HWND hWndMainWindow;
IAccessible *paccMainWindow = NULL; HRESULT hr;
//得到标题为"运行"的窗口的句柄
if(NULL == (hWndMainWindow = FindWindow(NULL, "运行")))
{ MessageBox(NULL, "没有发现窗口!", "错误", MB_OK); }
else
{ //通过窗口句柄得到窗口的 IAccessible 接口指针。
if(S_OK == (hr = AccessibleObjectFromWindow(hWndMainWindow, OBJID_WINDOW, IID_IAccessible, (void**)&paccMainWindow)))
{ //……我们可以通过这个指针paccMainWindow进行操作。 paccMainWindow->Release(); } }
现在我们已经得到窗口的 IAccessible 接口指针了(paccMainWindow),那么,我们可以干什么呢?我们怎么得到窗口中某个控件的 IAccessible 接口指针呢?我们就以上面的运行窗口为例。看看如何得到文本框的 IAccessible 接口指针!!
首先我们启动 inspect32.exe,什么?你不知道这是什么东西?赶紧先下载个Active Accessibility SDK看看吧……
然后,把鼠标放到所关注的控件上(即上图中的文本输入框),你会得到如下信息:
图二
文章来源于领测软件测试网 https://www.ltesting.net/