解决方案 »

  1.   

    调用accChildCount先查看下有多少个子控件
      

  2.   


    会有子控件,但是 m_pCurAcc->get_accChild(varFirst,&pDisp); 就是会失败,获取不到。求帮忙,求指教... 好郁闷!!!
      

  3.   

    下面那样用呢varFirst.vt = VT_I4;
    varFirst.lVal = 1;
    hr = m_pCurAcc->get_accChild(varFirst,&pDisp);
      

  4.   


    不行,hr 为 S_FALSE  ,pDisp 为 0, 还是取不到东西。真心弄不明白啊...卧槽
      

  5.   

    上面 那个代码 是找第一个子元素,下面代码是找下一个子元素。写的都非常简单,不知道问题在哪,求帮忙,求指教!!!谢谢!!!HRESULT CNavigation::NavNext()
    {
    HRESULT hr = E_FAIL;
    if (NULL == m_pCurAcc)
    return hr; VARIANT varStart;
    VariantInit(&varStart);
    varStart.vt = VT_I4;
    varStart.lVal = CHILDID_SELF; VARIANT varNext;
    hr = m_pCurAcc->accNavigate(NAVDIR_NEXT,varStart,&varNext); if (!SUCCEEDED(hr))
    return hr; IDispatch* pDisp = NULL;
    if (VT_DISPATCH == varNext.vt)
    {
    pDisp = varNext.pdispVal;
    }
    else
    {
    hr = m_pCurAcc->get_accChild(varNext,&pDisp);
    } IAccessible *paccChild = NULL;
    if (pDisp)
    {
    hr = pDisp->QueryInterface(IID_IAccessible,(void**)&paccChild);
    hr = pDisp->Release();
    } if (SUCCEEDED(hr) && paccChild)
    {
    hr = SetFocus(paccChild,&varStart); PlayTxt(paccChild,&varStart); m_pCurAcc->Release();
    m_pCurAcc = NULL;
    m_pCurAcc = paccChild;
    } return hr;
    }
      

  6.   

    http://www.cnblogs.com/GnagWang/archive/2010/04/20/1716449.html
    这里的代码用了IEnumVARIANT来先查找判断后如果为空才会使用get_accChild
      

  7.   


    谢谢!这个 我看过,但是我不想用那个轮循的方式来获取。
    难道 accNavigate 导航不能用么?  好郁闷哦~~~
      

  8.   

    varNext的值都是什么了,可能得判断下
      

  9.   


    varNext 的值 是VT 为9 也就是 VT_DISPATCH,走的是这一步 : 
    IDispatch* pDisp = NULL;
    if (VT_DISPATCH == varNext.vt)
    {
    pDisp = varNext.pdispVal;
    }
      

  10.   

    那就没调用get_accChild了,而且也不能用get_accChild方法了
      

  11.   


    不是啊 , 我是先调用了 hr = m_pCurAcc->accNavigate(NAVDIR_FIRSTCHILD,varStart,&varFirst);
    获取到第一个元素,然后调用 hr = m_pCurAcc->accNavigate(NAVDIR_NEXT,varStart,&varNext); 获取到第二哥元素(paccChild)赋值给 m_pCurAcc ,然后 再调用 hr = m_pCurAcc->accNavigate(NAVDIR_FIRSTCHILD,varStart,&varFirst); 去获取最小化按钮元素。 结果这个时候 varFirst 的 VT = VT_I4 ,然后使用 get_accChild 方法获取,结果失败了。
      

  12.   

    求救。。求救~~难道没人帮忙解答一下 accNavigate 的用法么???谢谢啦~
      

  13.   

    问题貌似解决了,很开心,跟大家分享一下下我先说下原理:当 VARIANT.vt 为VT_I4时调用 get_accChild 失败,获取不到子元素的时候,其实当前元素m_pCurAcc的第一个子元素跟m_pCurAcc是同一级的,这个时候你只需要使用 hr = m_pCurAcc->accNavigate(NAVDIR_FIRSTCHILD,varStart,&varFirst); 调用后返回的 varFirst 去获取他的信息。如果想做成可连续使用的方法,必须保存 varFirst 的值,作为下一次调用 accNavigate 方法中 varStart 的值,因为元素没变,找NEXT下一个元素起点必须要变化。 解释的不是很好,也不是很正确,谢谢 fishion 的帮助,谢谢!!!下面是我写的几个函数的代码,如有错误,还请不吝指教,多谢!成员变量:
    IAccessible *m_pCurAcc; VARIANT m_varStart;成员方法:
    void CNavigation::ResetVarStart( VARIANT& var )
    {
    var.vt = VT_I4;
    var.lVal = CHILDID_SELF;
    }HRESULT CNavigation::NavFirst()
    {
    HRESULT hr = E_FAIL;
    if (NULL == m_pCurAcc)
    return hr; ResetVarStart(m_varStart); VARIANT varFirst;
    VariantInit(&varFirst);
    hr = m_pCurAcc->accNavigate(NAVDIR_FIRSTCHILD,m_varStart,&varFirst); if (SUCCEEDED(hr) && varFirst.vt != VT_EMPTY)
    {
    IDispatch* pDisp = NULL;
    if (VT_DISPATCH == varFirst.vt)
    {
    pDisp = varFirst.pdispVal;
    }
    else
    {
    hr = m_pCurAcc->get_accChild(varFirst,&pDisp);
    m_varStart = varFirst;
    } IAccessible *paccChild = NULL;
    if (pDisp)
    {
    hr = pDisp->QueryInterface(IID_IAccessible, (void**)&paccChild);
    hr = pDisp->Release();
    } //////////////////////////////////////////////////////////////////////////
    if (paccChild)
    {
    hr = m_pCurAcc->Release();
    m_pCurAcc = paccChild;
    varFirst.vt = VT_I4;
    varFirst.lVal = CHILDID_SELF;
    } if (SUCCEEDED(hr) && m_pCurAcc)
    {
    hr = SetFocus(m_pCurAcc,&varFirst); PlayTxt(m_pCurAcc,&varFirst); }
    }
    VariantClear(&varFirst); return hr;
    }HRESULT CNavigation::NavNext()
    {
    HRESULT hr = E_FAIL;
    if (NULL == m_pCurAcc)
    return hr; VARIANT varNext;
    VariantInit(&varNext);
    hr = m_pCurAcc->accNavigate(NAVDIR_NEXT,m_varStart,&varNext); if (SUCCEEDED(hr) && varNext.vt != VT_EMPTY)
    {
    IDispatch* pDisp = NULL;
    if (VT_DISPATCH == varNext.vt)
    {
    pDisp = varNext.pdispVal;
    }
    else if (VT_I4 == varNext.vt)
    {
    hr = m_pCurAcc->get_accChild(varNext,&pDisp);
    m_varStart = varNext;
    } IAccessible *paccChild = NULL;
    if (pDisp)
    {
    hr = pDisp->QueryInterface(IID_IAccessible,(void**)&paccChild);
    hr = pDisp->Release();
    } //////////////////////////////////////////////////////////////////////////
    if (paccChild)
    {
    hr = m_pCurAcc->Release();
    m_pCurAcc = paccChild;
    varNext.vt = VT_I4;
    varNext.lVal = CHILDID_SELF;
    } if (SUCCEEDED(hr) && m_pCurAcc)
    {
    hr = SetFocus(m_pCurAcc,&varNext); PlayTxt(m_pCurAcc,&varNext);
    }
    }
    VariantClear(&varNext); return hr;
    }HRESULT CNavigation::NavPrevious()
    {
    HRESULT hr = E_FAIL;
    if (NULL == m_pCurAcc)
    return hr; VARIANT varPre;
    VariantInit(&varPre);
    hr = m_pCurAcc->accNavigate(NAVDIR_PREVIOUS,m_varStart,&varPre); if (SUCCEEDED(hr) && varPre.vt != VT_EMPTY)
    {
    IDispatch* pDisp = NULL;
    if (VT_DISPATCH == varPre.vt)
    {
    pDisp = varPre.pdispVal;
    }
    else
    {
    hr = m_pCurAcc->get_accChild(varPre,&pDisp);
    m_varStart = varPre;
    } IAccessible* paccChild = NULL;
    if (pDisp)
    {
    hr = pDisp->QueryInterface(IID_IAccessible,(void**)&paccChild);
    hr = pDisp->Release();
    } //////////////////////////////////////////////////////////////////////////
    if (paccChild)
    {
    hr = m_pCurAcc->Release();
    m_pCurAcc = paccChild;
    varPre.vt = VT_I4;
    varPre.lVal = CHILDID_SELF;
    } if (SUCCEEDED(hr) && m_pCurAcc)
    {
    hr = SetFocus(m_pCurAcc,&varPre); PlayTxt(m_pCurAcc,&varPre); }
    }
    VariantClear(&varPre); return hr;
    }HRESULT CNavigation::NavParent()
    {
    HRESULT hr = E_FAIL;
    if (NULL == m_pCurAcc)
    return hr; IAccessible *paccChild = NULL;
    if ( VT_DISPATCH == m_varStart.vt || CHILDID_SELF == m_varStart.lVal )
    {
    IDispatch* pDisp = NULL;
    hr = m_pCurAcc->get_accParent(&pDisp);
    if (pDisp)
    {
    pDisp->QueryInterface(IID_IAccessible,(void**)&paccChild);
    }
    if (SUCCEEDED(hr) && paccChild)
    {
    m_pCurAcc->Release();
    m_pCurAcc = paccChild;
    }
    } ResetVarStart(m_varStart);
    if (m_pCurAcc)
    {
    hr = SetFocus(m_pCurAcc,&m_varStart); PlayTxt(m_pCurAcc,&m_varStart);
    } return hr;
    }
      

  14.   

    我也是在 get_accChild处出错了,不过我的返回值是REGDB_E_IIDNOTREG, 意思就是“Interface not registered”, 哪位高手帮帮忙,谢谢了