1

我正在尝试为我的 Win32/MFC 应用程序中的WC_LISTVIEW控件添加辅助功能支持。我正在使用Windows 10 中的 Windows 讲述人工具来测试结果。默认情况下,它只读取选定行的主要项目名称。例如,在这种情况下:

在此处输入图像描述

当我需要它阅读整行时,它只会读取国家/地区。

所以我发现我可以使用这个例子为列表视图控件设置一个服务器注解

我首先将其设置为:

CAccPropServer_ListView* pMyPropSrv = NULL;
HRESULT hr;

CComPtr<IAccPropServices> pAccPropSvc = NULL;
hr = ::CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER, IID_IAccPropServices, (void **)&pAccPropSvc);
if(SUCCEEDED(hr) &&
    pAccPropSvc )
{
    pMyPropSrv = new (std::nothrow) CAccPropServer_ListView( pAccPropSvc );
    if( pMyPropSrv )
    {

        MSAAPROPID propids[] = {
            PROPID_ACC_NAME,
        };

        hr = pAccPropSvc->SetHwndPropServer( hWndListCtrl, OBJID_CLIENT,
            CHILDID_SELF, propids, 1, pMyPropSrv, ANNO_CONTAINER);

        pMyPropSrv->Release();
    }
}

CAccPropServer_ListView班级完成所有工作的地方:

class CAccPropServer_ListView: public IAccPropServer
{
    ULONG               m_Ref;
    IAccPropServices *  m_pAccPropSvc;

public:

    CAccPropServer_ListView( IAccPropServices * pAccPropSvc )
        : m_Ref( 1 ),
          m_pAccPropSvc( pAccPropSvc )
    {
        m_pAccPropSvc->AddRef();
    }

    ~CAccPropServer_ListView()
    {
        m_pAccPropSvc->Release();
    }


    /* TODO: Addref/Release/QI go here...
           Skipped them for brevity...
     */


    HRESULT STDMETHODCALLTYPE GetPropValue (const BYTE * pIDString,
        DWORD dwIDStringLen, MSAAPROPID idProp, VARIANT * pvarValue,
        BOOL * pfGotProp )
    {
        if(!pfGotProp)
            return E_POINTER;

        pvarValue->vt = VT_EMPTY;
        *pfGotProp = FALSE;

        HWND  hwnd;
        DWORD idObject;
        DWORD idChild;

        if( S_OK != m_pAccPropSvc->DecomposeHwndIdentityString( pIDString, 
                  dwIDStringLen, &hwnd, &idObject, &idChild ) )
        {
            return S_OK;
        }

        if( idChild != CHILDID_SELF )
        {
            if( idProp == PROPID_ACC_NAME )
            {
                CString str;
                str.Format(L"Line index %d", idChild);

                BSTR bstr = ::SysAllocString((LPCTSTR)str.GetString());
                pvarValue->vt = VT_BSTR;
                pvarValue->bstrVal = bstr;

                *pfGotProp = TRUE;
            }
        }

        return S_OK;
    }



};

所以我的问题是关于GetPropValue上面的方法,它实际上会生成文本提示,供讲述人大声朗读。

如何从DecomposeHwndIdentityStringidChild返回的中获取讲述人读取的行的索引?

在我上面的例子中,纯粹是通过实验,我得到了以下值:

"Line index 17"
"Line index 33"
"Line index 49"
"Line index 65"
and so on

这将转换为0x11, 0x21, 0x31,0x41不是行索引。这些 ID 是否记录在任何地方SysListView32

4

0 回答 0