分類:[C/C++]
2008/11/30(Sun) 10:59:14 編集(投稿者)
こんにちは。
Excel 2007のUserFormのウィンドウハンドルから
IAccessibleインタフェースを取り出して、子孫要素を辿っているのですが、
コンテキストメニューの様な取得に失敗する要素があります。
> int arr[] = { -1, 1, 1 };
これらは、IEnumVARIANT::Nextによって得られたChild IDですが
以下のコードで同様にして得られたIDをIAccessible::get_accChildの引数で渡しても
S_FALSEが返されて、失敗します。
非表示項目のためか、accNavigateでも失敗します。
AccessibleChildren APIも同じIDを返すため、結果は変わりません。
Accessible Explorerではきちんと要素を取得出来るので
何か方法があるはずですが、それが分かりません。
どなたか、お分かりになる方、宜しくお願いします。
環境 Vista、VC++ 2008 EE
※ 長くなるのでエラー処理は省いています。
---
#include <windows.h>
#include <oleacc.h>
#include <comdef.h>
#include <stdlib.h>
#pragma comment( lib, "oleacc.lib" )
int main()
{
::CoInitialize( NULL );
HWND hWnd = ::FindWindow( L"ThunderDFrame", NULL);
IAccessible* pacc;
::AccessibleObjectFromWindow( hWnd, OBJID_CLIENT, __uuidof( IAccessible ), (void**)&pacc);
IDispatch* pDisp;
pacc->get_accParent( &pDisp );
pacc->Release();
pDisp->QueryInterface( &pacc );
pDisp->Release();
int arr[] = { -1, 1, 1 };
for ( int i = 0; i < _countof( arr ); i++ ){
_variant_t varChild;
varChild.vt = VT_I4;
varChild.lVal = arr[i];
pacc->get_accChild( varChild, &pDisp );
pacc->Release();
pDisp->QueryInterface( __uuidof( IAccessible ), (void**)&pacc );
pDisp->Release();
}
IEnumVARIANT* pEnum;
pacc->QueryInterface ( __uuidof( IEnumVARIANT ), (void**)&pEnum );
long Count;
pacc->get_accChildCount( &Count );
_variant_t* v = new _variant_t[ Count ];
ULONG CeltFetched;
pEnum->Next( Count , v, &CeltFetched );
for (int i = 0; i < CeltFetched; i++){
if( v[i].vt == VT_I4 ){
//コンテキストメニュー
HRESULT hr = pacc->get_accChild( v[i], &pDisp);
//S_FALSEを返すので、SUCCEEDEDマクロは使えない。
if( hr == S_OK ) {
pDisp->Release();
}
}
}
delete[] v;
pEnum->Release();
pacc->Release();
::CoUninitialize();
return 0;
}