目的在于获取此窗口中可编辑域中的文本值,目前就测试“收件人”、“抄送”、“主题”这三个文本域用AccExplorer对这三个文本域窗口分析,其中它们都在一个class为OE_Envelope的窗口中,自然这个窗口在“新邮件”(class为ATH_Note)主窗口中,并且包括“收件人”、“抄送”、“主题”这三个窗口,一共6个,如下图:其中的最后三个class 为RichEdit20W类型的应该就是 所要测试的文本编辑域窗口吧我的思路是:
1、用FindWindowEx()获取“新邮件”主窗口的句柄
2、用FindWindowEx()获取OE_Envelope子窗口的句柄
3、用AccessibleObjectFromWindow()通过OE_Envelope子窗口的句柄取得其IAccessible接口
4、然后通过这个窗口的IAccessible接口一一获取这三个文本编辑域窗口的IAccessible接口
接口指针,再通过这个IAccessible接口get_accValue()来获取其值具体代码如下:HWND hWndMainWindow1,hWndMainWindow2;
IAccessible *paccParent = NULL;
IEnumVARIANT* pEnum = NULL;
ULONG numFetched;
IDispatch* pDisp = NULL;
IAccessible* pCAcc = NULL;
HRESULT hr;

//IAccessible* paccControl = NULL;
VARIANT varChild; //varControl,
char szObjClass[15];

CoInitialize(NULL);

hWndMainWindow1 =::FindWindowEx(NULL,NULL,"ATH_Note",NULL);
hWndMainWindow2=::FindWindowEx(hWndMainWindow1,NULL,"OE_Envelope",NULL);
if( hWndMainWindow2 ==NULL )
::AfxMessageBox("取‘OE_Envelope’窗口句柄失败!!");

if(S_OK == (hr = AccessibleObjectFromWindow(hWndMainWindow2, OBJID_WINDOW, IID_IAccessible,(void**)&paccParent)))
{
::AfxMessageBox("取得OE_Envelope窗口的IAccessible接口成功");
long iacc=0;
BSTR tmp;
CString value;   hr=paccParent->QueryInterface(IID_IEnumVARIANT,(PVOID*)&pEnum); //得到父亲支持的IEnumVARIANT接口
if(pEnum)
pEnum->Reset(); paccParent->get_accChildCount(&iacc);  //取得父亲拥有的可访问的子的数目
CString childCount;
childCount.Format("%d",iacc);
::AfxMessageBox("childCount=");
::AfxMessageBox(childCount);

for(int i=3;i<=iacc;i++)  //搜索并比较从第三个往后的子ID
{
pCAcc = NULL;
if(pEnum)  // 如果支持IEnumVARIANT接口,得到下一个子ID
{
hr=pEnum->Next(1,&varChild,&numFetched);
}
else  //如果一个父亲不支持IEnumVARIANT接口,子ID就是它的序号
{
varChild.vt=VT_I4;
varChild.lVal=i;
}
// Get IDispatch interface for the child
if(varChild.vt==VT_I4)
{
hr=paccParent->get_accChild(varChild,&pDisp);   
}
else
{
pDisp = varChild.pdispVal;
}
// Get IAccessible interface for the child
if( pDisp )
{
hr = pDisp->QueryInterface(IID_IAccessible,(void**)&pCAcc);
hr = pDisp->Release();
}
if( pCAcc )
{
::VariantInit(&varChild);
varChild.vt = VT_I4;
varChild.iVal = CHILDID_SELF;

GetObjectClass(pCAcc, szObjClass, sizeof(szObjClass));
if(szObjClass)
{
CString sss;
sss = szObjClass;
::AfxMessageBox("Class=");
::AfxMessageBox(sss);
} char *szName = "RichEdit20W";
if( strcmp( szObjClass,szName ) == 0 )
{
::AfxMessageBox("找到文本编辑域!");
hr = pCAcc->get_accValue(varChild,&tmp);
if( SUCCEEDED( hr ) )
{
value=tmp;
::AfxMessageBox("value=:");
::AfxMessageBox(value);
}
else
{
::AfxMessageBox( "读取value失败" );
} } }
                   }  // end for()
         }  // end if ( AccessibleObjectFromWindow )
结果是GetObjectClass(pCAcc, szObjClass, sizeof(szObjClass)) 取得值一直都是OE_Envelope,即这些文本编辑域窗口所在(相对)主窗口的class,并非RichEdit20W,所以取不到其vaule高手给看看是怎么回事,不胜感激!!!