c++ 在 Google Chrome 中启用可访问性检查

Posted

技术标签:

【中文标题】c++ 在 Google Chrome 中启用可访问性检查【英文标题】:c++ enable accessibility inspection in Google Chrome 【发布时间】:2017-08-19 06:16:00 【问题描述】:

我正在尝试访问 Google Chrome 网页的文本以阅读它并提供一些操作(例如,提醒)。一切正常,但我需要以编程方式启用可访问性检查。我使用此代码:

wchar_t className[100];
GetClassName(hwnd, className, 100) == 0 || wcscmp(className, L"Chrome_WidgetWin_1");

CComPtr<IAccessible> pAccMain;
HRESULT hr = ::AccessibleObjectFromWindow(hWndChrome, 1, IID_IAccessible, (void**)(&pAccMain));

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

在我使用 --force-renderer-accessibility 参数运行浏览器或手动更改位于 chrome://accessibility 中的可访问性设置之前,什么都不会发生。

我做错了什么?

找到此信息:“Chrome 使用 EVENT_SYSTEM_ALERT 和自定义对象 ID 1 调用 NotifyWinEvent。如果它随后收到针对该自定义对象 ID 的 WM_GETOBJECT 调用,则假定辅助技术正在运行”。有人知道如何实现吗?

【问题讨论】:

【参考方案1】:

使用SetWinEventHook,例如

HWINEVENTHOOK hook = SetWinEventHook(EVENT_SYSTEM_ALERT, EVENT_SYSTEM_ALERT,NULL, WinEventProc, 0, 0, WINEVENT_OUTOFCONTEXT)

然后在您的 WinEventProc 中,当 Chrome 发送 EVENT_SYSTEM_ALERT 时,您将获得一个 hWnd、idObject 和 idChild。

如果 idObject == 1 则调用 AccessibleObjectFromEvent(),将 hWnd、idObject 和 idChild 参数传递给它。

AccessibleObjectFromEvent 然后将发送 WM_GETOBJECT。 From the docs::

应用程序从不直接发送此消息。 Microsoft Active Accessibility 发送此消息以响应对 AccessibleObjectFromPoint、AccessibleObjectFromEvent 或 AccessibleObjectFromWindow 的调用。

通过使用 AccEvent,我可以看到谷歌浏览器似乎只在启动时发送 EVENT_SYSTEM_ALERT,例如打开新标签不会触发它,因此您需要在 Chrome 启动之前完成 SetWinEventHook()。

【讨论】:

以上是关于c++ 在 Google Chrome 中启用可访问性检查的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google Chrome 启用 scrollX 或 scrollY 时,数据表中出现重复的空标题

如何为 Google Chrome 启用自动登录用户身份验证

Google Chrome扩展程序与安全网站交互

google chrome 浏览器怎么去广告插件

google访问助手

chrome启用跨域正确方法