IAccessible->get_accChild 失败,谢谢帮忙! 导航IAccessibleMSAA 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 调用accChildCount先查看下有多少个子控件 会有子控件,但是 m_pCurAcc->get_accChild(varFirst,&pDisp); 就是会失败,获取不到。求帮忙,求指教... 好郁闷!!! 下面那样用呢varFirst.vt = VT_I4;varFirst.lVal = 1;hr = m_pCurAcc->get_accChild(varFirst,&pDisp); 不行,hr 为 S_FALSE ,pDisp 为 0, 还是取不到东西。真心弄不明白啊...卧槽 上面 那个代码 是找第一个子元素,下面代码是找下一个子元素。写的都非常简单,不知道问题在哪,求帮忙,求指教!!!谢谢!!!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;} http://www.cnblogs.com/GnagWang/archive/2010/04/20/1716449.html这里的代码用了IEnumVARIANT来先查找判断后如果为空才会使用get_accChild 谢谢!这个 我看过,但是我不想用那个轮循的方式来获取。难道 accNavigate 导航不能用么? 好郁闷哦~~~ varNext的值都是什么了,可能得判断下 varNext 的值 是VT 为9 也就是 VT_DISPATCH,走的是这一步 : IDispatch* pDisp = NULL; if (VT_DISPATCH == varNext.vt) { pDisp = varNext.pdispVal; } 那就没调用get_accChild了,而且也不能用get_accChild方法了 不是啊 , 我是先调用了 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 方法获取,结果失败了。 求救。。求救~~难道没人帮忙解答一下 accNavigate 的用法么???谢谢啦~ 问题貌似解决了,很开心,跟大家分享一下下我先说下原理:当 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;} 我也是在 get_accChild处出错了,不过我的返回值是REGDB_E_IIDNOTREG, 意思就是“Interface not registered”, 哪位高手帮帮忙,谢谢了 listctrl 一个特别的效果,大数据量时候停顿效果 关于outlookbar导航条的应用 向高手请教一下~~~ 推荐下,数据程序用什么控件好呢? ADO连接access数据库 连接不上 新手请教:如何用samplegrabber来抓去视频图像? 怎样在窗口中通过点击多个按钮或静态控件显示一张图片? 一个小问题,请帮忙! !!!!!请教高手怎样截取mpg文件? 求书:Visual C++ 6.0 MFC时尚编程百例 如何获得CTreeCtrl的节点图标 DoDragDrop不返回,导致窗口不刷新,如何解决
会有子控件,但是 m_pCurAcc->get_accChild(varFirst,&pDisp); 就是会失败,获取不到。求帮忙,求指教... 好郁闷!!!
varFirst.lVal = 1;
hr = m_pCurAcc->get_accChild(varFirst,&pDisp);
不行,hr 为 S_FALSE ,pDisp 为 0, 还是取不到东西。真心弄不明白啊...卧槽
{
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;
}
这里的代码用了IEnumVARIANT来先查找判断后如果为空才会使用get_accChild
谢谢!这个 我看过,但是我不想用那个轮循的方式来获取。
难道 accNavigate 导航不能用么? 好郁闷哦~~~
varNext 的值 是VT 为9 也就是 VT_DISPATCH,走的是这一步 :
IDispatch* pDisp = NULL;
if (VT_DISPATCH == varNext.vt)
{
pDisp = varNext.pdispVal;
}
不是啊 , 我是先调用了 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 方法获取,结果失败了。
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;
}