我们现在主要关注的信息是:Name、Role、Window className。
Name = "打开(O):"
Role = "可编辑文字"
Window className = "Edit"
当开发自定义、owner drawn 或者无窗口的控件时,为同一窗口的每个"角色-名字"指定独一无二的表示是一个非常好的编程习惯。然而,如果由于某种原因,同一窗口中的2个 UI 元素具有同样的"角色-名字"对,那么就需要增加一个参数--windows 类--以唯一的来表示这个元素。
FindChild 函数显示了一个基于 Active Accessibility 父/子(你可以理解成父窗口/子窗口的关系,只是为了便于理解:-P)导航的搜索例程的实现。这个函数有6个参数。前4个包含传递给函数的信息,后2个包含了 IAccessible 接口/子ID对(见附录)。
下面我们开始取文本输入框的 IAccessible 接口指针。
IAccessible* paccControl = NULL;//输入框的 IAccessible 接口
VARIANT varControl; //子ID。
FindChild( paccMainWindow, "打开(O):", "可编辑文字", "Edit", &paccControl, &varControl )
第一个参数是先前得到的窗口 IAccessible 接口指针。
第二、三、四个参数分别是名字、角色、类。
后2个为返回参数包含了 IAccessible 接口/子ID对。下面是FindChild的实现。
BOOL FindChild (IAccessible* paccParent,
LPSTR szName, LPSTR szRole,
LPSTR szClass,
IAccessible** paccChild,
VARIANT* pvarChild)
{ HRESULT hr;
long numChildren;
unsigned long numFetched;
VARIANT varChild;
int index;
IAccessible* pCAcc = NULL;
IEnumVARIANT* pEnum = NULL;
IDispatch* pDisp = NULL;
BOOL found = false;
char szObjName[256], szObjRole[256], szObjClass[256], szObjState[256];
//得到父亲支持的IEnumVARIANT接口 hr = paccParent -> QueryInterface(IID_IEnumVARIANT, (PVOID*) & pEnum);
if(pEnum) pEnum -> Reset();
//取得父亲拥有的可访问的子的数目 paccParent -> get_accChildCount(&numChildren);
//搜索并比较每一个子ID,找到名字、角色、类与输入相一致的。 for(index = 1;
index <= numChildren && !found; index++) { pCAcc = NULL;
// 如果支持IEnumVARIANT接口,得到下一个子ID //以及其对应的 IDispatch 接口 if (pEnum) hr = pEnum -> Next(1, &varChild, &numFetched);
else { //如果一个父亲不支持IEnumVARIANT接口,子ID就是它的序号 varChild.vt = VT_I4; varChild.lVal = index; }
// 找到此子ID对应的 IDispatch 接口
if (varChild.vt == VT_I4) { //通过子ID序号得到对应的 IDispatch 接口 pDisp = NULL; hr = paccParent -> get_accChild(varChild, &pDisp); }
else
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/