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 时,数据表中出现重复的空标题