窗口 – 什么是正确的解决方案来支持文本编辑器中的插入符号移动的IAccesible接口?

我想从头开始实现一个支持IAccessible接口的文本编辑器.我使用的是MFC和Win32 API.

当标记文本编辑器(如记事本)中的插入符位置发生变化时,插入符号移动的相应字母,单词或行将通过客户端工具(如Narrator,JAWS等)发音.我不知道如何实现此功能.我搜索互联网并阅读MSDN文档.

我在http://msdn.microsoft.com/en-us/library/dd317978.aspxhttp://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;
}
客户端将使用SetWinEventHook()函数来跟踪插入符号的以下事件:

> EVENT_OBJECT_CREATE
> EVENT_OBJECT_DESTROY
> EVENT_OBJECT_SHOW
> EVENT_OBJECT_HIDE
> EVENT_OBJECT_LOCATIONCHANGE
> EVENT_OBJECT_FOCUS

如果您使用自定义控件,则需要使用NotifyWinEvent()自动触发这些事件,特别是应该触发旁白的EVENT_OBJECT_LOCATIONCHANGE.

当客户端处理事件发生时,它应该使用AccessibleObjectFromEvent()访问他正在跟踪的对象的IAccessible接口.

正如你所说,Microsoft Active Accessibility将处理此调用,并根据给予AccessibleObjectFromEvent()的处理程序(应该是事件中包含的处理程序),向相应的窗口发送WM_GETOBJECT消息.

当您接收到插入符的WM_GETOBJECT时,应该返回相应的IAccessible接口,该接口将报告适当的accRole和accLocation.

如果您没有收到正确的WM_GETOBJECT消息,可能是因为您没有触发正确的事件.

您可以使用Accessible Event Watcher来检查是否发送正确的事件:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd317979%28v=vs.85%29.aspx

请参阅MSDN上的主动辅助功能服务器开发人员指南:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx

编辑

另外,如果您使用Riched20.dll提供的标准插入符号(以Rich编辑为例),该文档规定,与其他UI元素不同,它没有关联的窗口句柄.

相关文章
相关标签/搜索