我想从头开始实现一个支持IAccessible接口的文本编辑器.我正在使用MFC和Win32 API.
当标记文本编辑器(如记事本)中的插入符号位置发生变化时,插入符号移动的相应字母,单词或行将由Narrator,JAWS等客户端工具发音.我不知道如何实现此功能.我搜索互联网并阅读MSDN文档.
我在http://msdn.microsoft.com/en-us/library/dd317978.aspx和http://msdn.microsoft.com/en-us/library/dd373892.aspx上读到客户端通过AccessibleObjectFromWindow方法请求插入符号从OS,OS将WM_GETOBJECT发送到应用程序.WM_GETOBJECT消息在相应的窗口回调函数中接收,但是插入符号移动事件的hWnd为NULL.我检查了线程消息队列,但是在线程消息队列中根本没有收到WM_GETOBJECT.
一种方法虽然有效,但不是正确的解决方案
NotifyWinEvent( EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF )
Run Code Online (Sandbox Code Playgroud)
当插入符被用户移动时 当客户端要求更改名称时,我会返回与插入符号移动相关的相应文本.
HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName)
{
*pszName = SysAllocString( L"CORESPONDING TEXT TO THE CARET MOVEMENT" );
return S_OK;
}
Run Code Online (Sandbox Code Playgroud) 我注意到Process Monitor通过IAccessible(MSAA)接口访问Mozilla Firefox会导致文件访问名为"Accessibility.api"的Adobe Reader文件.当我使用Microsoft的Inspect.exe(使用MSAA)访问Mozilla Firefox时,我没有获得这些文件访问权限.
这是代码(C++)导致大约28次访问"Accessibility.api"文件访问:
CComPtr<IAccessible> mainElement;
::AccessibleObjectFromWindow(mainWindowHandle, static_cast<DWORD>(OBJID_CLIENT), IID_IAccessible, reinterpret_cast<void**>(&mainElement));
Run Code Online (Sandbox Code Playgroud)
每个::AccessibleChildren或IEnumVariant::Next调用也会导致每个子元素大约28个访问.
如何防止像Inspect.exe这样的文件访问?
我在Chrome上获得了相同的结果.
Adobe Reader未作为插件安装在这些浏览器上.
我试图重命名Accessible.api文件(位于C:\ Program Files(x86)\ Adobe\Acrobat Reader DC\Reader\plug_ins\Accessibility.api)以禁用它,但之后我无法访问任何浏览器元素更多.结果子元素不同.Inspect.exe(使用MSAA)或Ranorex Spy(没有浏览器扩展名)没有这些问题.我也用AccProbe检查了结果,这个工具产生了和我一样的结果.
看起来这只会影响32位应用程序.Inspect.exe和Ranorex Spy是64位应用程序.我的应用程序和AccProbe(安装的JRE是32位)是32位.因为Adobe Reader是32位我认为这就是为什么只有32位应用程序受到影响.我还可以使用32位版本的Ranorex Spy重现此行为.
现在我知道这种行为不是由错误的实现引起的.但是为什么这么多访问这个Adobe Reader Accessibility.api文件的问题仍然存在......
我正在尝试为Google Chrome创建QA自动化,以便模拟点击并在标签按钮上接收点击事件.
我正在使用IAccessible接口和AccessibleChildren API来获取完整的可访问元素树.
使用AccExplorer 2.0查看树时 - 它看起来很棒(见最后的图片).
但是我的程序只显示了一个部分树,名称与我在AccExplorer上看到的名称不匹配.
我在跑:
任何想法为什么我无法查看完整的树?
谢谢
这是我的程序源码(C++):( 类似于MSDN示例)
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); …Run Code Online (Sandbox Code Playgroud) 我正在开始研究可访问性,但我对遇到的不同技术感到有些困惑。
IAccessible 和 IAccessible2 有什么区别?我最初认为 IAccessible2 可能是 IAccessible 的更新版本,但经过进一步研究,它看起来实际上是由 Microsoft 的竞争对手制造的。维基百科说“它已被定位为微软新的 UI 自动化 API 的替代品。” MSAA 如何融入其中?
任何人都可以澄清 IAccessible、IAccessible2、UI 自动化 API 和 MSAA 之间的区别吗?为什么一个可能比另一个更可取?