A.D*_*esh 13 windows winapi mfc iaccessible ui-automation
我想从头开始实现一个支持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)
客户端将使用SetWinEventHook()函数来跟踪插入符的以下事件:
如果您使用自定义控件,则需要使用NotifyWinEvent()自行触发这些事件,尤其是应该触发旁白的EVENT_OBJECT_LOCATIONCHANGE.
当客户端处理事件时,它应该使用AccessibleObjectFromEvent()访问他正在跟踪的对象的IAccessible接口.
正如您所说,Microsoft Active Accessibility将处理此调用并将WM_GETOBJECT消息发送到相应的窗口,具体取决于为AccessibleObjectFromEvent()提供的处理程序(应该是事件中包含的处理程序).
当您收到插入符号的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上的Active Accessibility Servers开发人员指南:http: //msdn.microsoft.com/en-us/library/windows/desktop/dd318053%28v=vs.85%29.aspx
编辑
此外,如果您使用Riched20.dll提供的标准插入符(在Rich Edit中作为实例),文档规定与其他UI元素不同,它没有关联的窗口句柄.
归档时间: |
|
查看次数: |
1186 次 |
最近记录: |