gpt4 book ai didi

c++ - 将 IAccessible 与 Google Chrome 一起使用会返回不完整的树

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:22 29 4
gpt4 key购买 nike

我正在尝试为 Google Chrome 创建 QA 自动化,以模拟点击并接收标签按钮上的点击事件。

我正在使用 IAccessible interfaceAccessibleChildren API获取完整的可访问元素树。

当使用 AccExplorer 2.0 查看树时 - 它看起来很棒(见最后的图片)。

但我的程序只显示了部分树,而且名称与我在 AccExplorer 上看到的不匹配。

我在运行:

  • Chrome 37 测试版
  • Win 7 64 位

为什么我看不到完整的树有什么想法吗?

谢谢

这是我程序的源代码(C++): (similar to MSDN example)

int _tmain(int argc, _TCHAR* argv[])
{
int i=0;
HWND hWndChrome = NULL;
hWndChrome = (HWND)0x000702c0;
wcout << L"\n\nChrome_WidgetWin_1 = "<< hex << hWndChrome << "\n--------------------------";

CComPtr<IAccessible> pAccMain;
::AccessibleObjectFromWindow(hWndChrome, OBJID_CLIENT, IID_IAccessible, (void**)(&pAccMain));

WalkTreeWithAccessibleChildren(pAccMain, 0);
_getch();

return 0;
}

HRESULT WalkTreeWithAccessibleChildren(__in CComPtr<IAccessible> pAcc, __in int depth)
{
long childCount = 0;
long returnCount = 0;

HRESULT hr = pAcc->get_accChildCount(&childCount);

if (childCount == 0)
return S_FALSE;

CComVariant* pArray = new CComVariant[childCount];
hr = ::AccessibleChildren(pAcc, 0L, childCount, pArray, &returnCount);
if (FAILED(hr))
return hr;

// Iterate through children.
for (int x = 0; x < returnCount; x++)
{
CComVariant vtChild = pArray[x];
// If it's an accessible object, get the IAccessible, and recurse.
if (vtChild.vt == VT_DISPATCH)
{
CComPtr<IDispatch> pDisp = vtChild.pdispVal;
CComQIPtr<IAccessible> pAccChild = pDisp;
if (!pAccChild)
continue;

// Print current accessible element
wcout << endl;
for (int y = 0; y < depth; y++) wcout << L" ";
wcout << L"* " << GetName(pAccChild, CHILDID_SELF).data() << L" | " << GetRole(pAccChild, CHILDID_SELF).data() << L" (Object)";

WalkTreeWithAccessibleChildren(pAccChild, depth + 1);
}
// Else it's a child element so we have to call accNavigate on the parent,
// and we do not recurse because child elements can't have children.
else
{
// Print current accessible element
wcout << endl;
for (int y = 0; y < depth; y++) wcout << L" ";
wcout << L"* " << GetName(pAcc, vtChild.lVal).data() << L" | " << GetRole(pAcc, vtChild.lVal).data() << " (Child)";
}
}
delete[] pArray;
return S_OK;
}

wstring GetName(__in CComPtr<IAccessible> pAcc, __in CComVariant varChild)
{
if (!pAcc)
return L"";
CComBSTR bstrName;
HRESULT hr = pAcc->get_accName(varChild, &bstrName);
if (FAILED(hr))
return L"";
if (!bstrName.m_str)
return L"<NULL>";
return bstrName.m_str;
}

wstring GetRole(__in CComPtr<IAccessible> pAcc, __in CComVariant varChild)
{
if (!pAcc)
return L"";
CComVariant varRoleID;
HRESULT hr = pAcc->get_accRole(varChild, &varRoleID);
if (FAILED(hr))
return L"";
WCHAR sRoleBuff[1024] = {0};
hr = ::GetRoleText(varRoleID.lVal, sRoleBuff, 1024);
if (FAILED(hr))
return L"";
return sRoleBuff;
}

这是控制台输出:

    Chrome_WidgetWin_1 = 000702C0
--------------------------
* Chrome Legacy Window | window (Object)
* System | menu bar (Object)
* <NULL> | title bar (Object)
* IME | push button (Child)
* Minimize | push button (Child)
* Maximize | push button (Child)
* Context help | push button (Child)
* Close | push button (Child)
* Application | menu bar (Object)
* Chrome Legacy Window | client (Object)
// -----> { there should be a big sub-tree here } <----- //
* Vertical | scroll bar (Object)
* Line up | push button (Child)
* Page up | push button (Child)
* Position | indicator (Child)
* Page down | push button (Child)
* Line down | push button (Child)
* Horizontal | scroll bar (Object)
* Column left | push button (Child)
* Page left | push button (Child)
* Position | indicator (Child)
* Page right | push button (Child)
* Column right | push button (Child)
* <NULL> | grip (Object)

这是显示完整树的 AccExplorer 屏幕截图:(一些节点已折叠) AccExplorer working example


编辑:
当使用 OBJID_WINDOW 而不是 OBJID_WINDOW (如在示例中,在 AccessibleObjectFromWindow 中)- 我得到了一棵包含更多节点的树,但我仍然不能查看选项卡元素。

最佳答案

好吧,过了很久,我发现了让一切变得不同的小事......
我忘了使用 CoInitialize()...

有趣的是,如果没有 CoInitialize() 它可以工作,但只有部分,并且没有 HRESULT 表明这一点(没有得到像 CO_E_NOTINITIALIZED 这样的任何东西)。

无论如何 - 如果您使用 IAccessible 而不使用 CoInitialize - 希望事情不能正常工作......

关于c++ - 将 IAccessible 与 Google Chrome 一起使用会返回不完整的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351277/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com