遍历查找一个元素:
IAccessible* WalkTreeWithAccessibleChildren(IAccessible* pAcc, const char* nameStr, int roleId)
{
HRESULT hr;
long childCount;
long returnCount;
hr = pAcc->get_accChildCount(&childCount);
VARIANT* pArray = new VARIANT[childCount];
hr = AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
IAccessible* pChild = NULL;
// 遍历子元素
for (int x = 0; x < returnCount; x++)
{
VARIANT vtChild = pArray[x];
VARIANT v;
BSTR name;
VARIANT role;
VariantInit(&role);
role.vt = VT_I4;
role.lVal = CHILDID_SELF;
// If it's an accessible object, get the IAccessible, and recurse.
if (vtChild.vt == VT_DISPATCH)
{
IDispatch* pDisp = vtChild.pdispVal;
hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pChild);
if (hr == S_OK)
{
VariantInit(&v);
v.vt = VT_I4;
v.lVal = CHILDID_SELF;
hr = pChild->get_accName(v, &name);
hr = pChild->get_accRole(v, &role);
if (name != NULL)
{
char* s = _com_util::ConvertBSTRToString(name);
std::cout << "当前name: " << s << ", " << role.lVal << std::endl;
if (strcmp(s, nameStr) == 0 && roleId == role.lVal)
{
std::cout << "找到了元素: " << s << ", " << role.lVal << std::endl;
delete s;
break;
}
else
{
delete s;
WalkTreeWithAccessibleChildren(pChild, nameStr, roleId);
pChild->Release();
}
}
else
{
WalkTreeWithAccessibleChildren(pChild, nameStr, roleId);
pChild->Release();
}
}
pDisp->Release();
}
else // 简单元素
{
//std::cout << "简单元素之前, pAcc的地址:" << pAcc << std::endl;
IDispatch* pDisp;
hr = pAcc->get_accChild(vtChild, &pDisp);
//std::cout << "简单元素之后, pAcc的地址:" << pAcc << std::endl;
//hr = pDisp->QueryInterface(IID_IAccessible, (void**)&pChild);
//pDisp->Release();
VariantInit(&v);
v.vt = VT_I4;
v.lVal = vtChild.lVal;
pAcc->get_accName(v, &name);
pAcc->get_accRole(v, &role);
if (name != NULL)
{
char* s = _com_util::ConvertBSTRToString(name);
std::cout << "当前name-else: " << s << ", " << role.lVal << std::endl;
if (strcmp(s, nameStr) == 0 && roleId == role.lVal)
{
{
VARIANT v2;
VariantInit(&v2);
v2.vt = VT_I4;
v2.lVal = CHILDID_SELF;
BSTR b;
hr = pAcc->get_accName(v2, &b);
long x33;
pAcc->get_accChildCount(&x33);
int xxx = 333;
}
std::cout << "name-else找到了元素: " << s << ", " << role.lVal << std::endl;
hr = pAcc->accDoDefaultAction(v);
delete s;
break;
}
}
}
}
delete[] pArray;
return pChild;
}