我想从头开始实现一个支持 IAccessible 接口的文本编辑器。我正在使用 MFC 和 Win32 API。
当记事本等标准文本编辑器中的插入符号位置发生变化时,插入符号移动的相应字母、单词或行由讲述人、JAWS 等客户端工具发音。我不知道如何实现此功能。我搜索互联网并阅读 MSDN 文档。
我在http://msdn.microsoft.com/en-us/library/dd317978.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;
}