再び、Takiです。
やりたいことはButton2の座標位置からPanel2→Panel1→Form1の
情報を得たいのです。
SDKに付いてくるInspedt.exeのAncestorsのような情報が欲しいのです。
AccessibleObjectFromPointとAcc.get_accParentを組み合わせれば
できそうなので、マスターのサンプルプログラムのEnumAccTreeItemsを
参考にして親の情報を得るプログラムを書いてみました。
QueryInterfaceとかのコードの意味は全く理解できていません。
見よう見まねで書いたコードです。
手続きtestをTimerで3秒おきに呼び出して、その都度一覧を得ています。
function getOya(ko:IAccessible;oyalist:TMemo):IAccessible;
var
varChild : OleVariant;
AccDisp : IDispatch;
rAcc :IAccessible;
s : wideString;
begin
result := nil;
if (ko = nil) then exit;
if ko.Get_accParent(AccDisp) = S_OK then // koの親をAccDispで受け取る
begin
if Assigned(AccDisp) then // AccDispが有効なら
begin
AccDisp.QueryInterface(IID_IAccessible,rAcc); // rAccへ
// 親のNameプロパティ 確認用
TVariantArg(varChild).vt := VT_I4;
TVariantArg(varChild).lVal := CHILDID_SELF; // これでいいのか?
if rAcc.Get_accName(varChild,s) = S_OK then
begin
oyalist.Lines.Append(s);
result := rAcc;
end;
end else begin
oyalist.Lines.Append('AccDisp 無効');
end;
end else begin
oyalist.Lines.Append('Get_acc 失敗');
end;
end;
procedure test; // これをTimerで呼び出す
var
pAcc : IAccessible;
varChild : OleVariant;
AccNext : IAccessible; // 親のオブジェクト
s : wideString;
i : integer;
mPos : TPoint;
begin
GetCursorPos(mPos);
if AccessibleObjectFromPoint(mPos,pAcc,varChild) = S_OK then
begin
FormMain.Memo1.Clear;
// マウスの位置のNameプロパティ
if pAcc.Get_accName(varChild,s) = S_OK then
begin
FormMain.Memo1.Lines.Append(s);
end;
// マウス位置のAccオブジェクトのNameプロパティ
TVariantArg(varChild).vt := VT_I4; // OleVariant型にセット
TVariantArg(varChild).lVal := CHILDID_SELF;
if pAcc.Get_accName(varChild,s) = S_OK then
begin
FormMain.Memo1.Lines.Append(s);
end;
accNext := pAcc;
for i := 0 to 10 do // 無限ループを回避するため
begin
accNext := getOya(accNext,FormMain.Memo1);
if (accNext = nil) then break;
end;
end;
end;
ワードとかはリボンまでしかさかのぼれません。
Get_accParentを使う方法では限界があるのでしょうか。
忘れていました。私の環境です。
Windows7Pro(32Bit)+DelphiXE(Starter)
uses plEnumAccInfos.pas
|