我想从头开始实现一个支持 IAccessible 接口的文本编辑器。我正在使用 MFC 和 Win32 API。
当记事本等标准文本编辑器中的插入符号位置发生变化时,“讲述人”、JAWS 等客户端工具将发音与插入符号移动相对应的字母、单词或行。我不知道如何实现此功能。我搜索互联网并阅读 MSDN 文档。
我读到http://msdn.microsoft.com/en-us/library/dd317978.aspx http://msdn.microsoft.com/en-us/library/dd317978.aspx and http://msdn.microsoft.com/en-us/library/dd373892.aspx http://msdn.microsoft.com/en-us/library/dd373892.aspx客户端通过操作系统的 AccessibleObjectFromWindow 方法请求插入符号,操作系统将 WM_GETOBJECT 发送到应用程序。在相应的窗口回调函数中收到WM_GETOBJECT消息,但插入符移动事件的hWnd为NULL。我检查了线程消息队列,但是线程消息队列中根本没有收到WM_GETOBJECT。
一种有效但不是正确解决方案的方法是调用
NotifyWinEvent( EVENT_OBJECT_NAMECHANGE, hwnd, OBJID_CLIENT, CHILDID_SELF )
当用户移动插入符时。当客户要求更改名称时,我返回与插入符号移动相关的相应文本。
HRESULT CMyEditor::get_accName(VARIANT varChild, BSTR *pszName)
{
*pszName = SysAllocString( L"CORESPONDING TEXT TO THE CARET MOVEMENT" );
return S_OK;
}
客户端将使用设置WinEventHook()函数来跟踪插入符的以下事件:
- 事件对象创建
- EVENT_OBJECT_DESTROY
- EVENT_OBJECT_SHOW
- EVENT_OBJECT_HIDE
- EVENT_OBJECT_LOCATIONCHANGE
- 事件对象焦点
如果使用自定义控件,则需要使用通知WinEvent()自己触发这些事件,特别是 EVENT_OBJECT_LOCATIONCHANGE ,它应该触发旁白。
当客户端处理这些事件时,它应该访问无障碍他正在跟踪的对象的界面AccessibleObjectFromEvent().
正如您所说,Microsoft Active Accessibility 将处理此调用,并根据给定的处理程序将 WM_GETOBJECT 消息发送到相应的窗口AccessibleObjectFromEvent()(这应该是事件中包含的处理程序)。
当您收到插入符号的 WM_GETOBJECT 时,您应该返回相应的无障碍接口将报告正确的accRole and 地点.
如果您没有收到正确的 WM_GETOBJECT 消息,可能是因为您没有触发正确的事件。
您可以使用无障碍事件观察者检查是否发送了正确的事件:http://msdn.microsoft.com/en-us/library/windows/desktop/dd317979%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/dd317979%28v=vs.85%29.aspx
请参阅 MSDN 上的 Active Accessibility Servers 开发人员指南:http://msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx
Edit
另外,如果您使用 Riched20.dll 提供的标准插入符号(在 Rich Edit 中作为实例),文档规定与其他 UI 元素不同,它没有关联的窗口句柄。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)