в гугл хроме, при входе на определенные сайты, выбивает окошко с выбором сертификатов для входа. суть проблемы что никак не могу достучаться до этого самого списка с сертификатами, чтобы можно было прочитать и сделать селект нужного и сэмулировать нажатие кнопки ок. само это окошко выбора находится, заголовок окошка есть, кнопки ок и дополнительные тоже читаются. а вот сам список - какая-то тайна за семью печатями. для поиска использовался подобный код:
Код:
function AccessibleChildren(paccContainer : Pointer; iChildStart : LONGINT; cChildren : LONGINT; out rgvarChildren : OleVariant; out pcObtained : LONGINT) : HRESULT; stdcall;
stdcall; external 'oleacc.dll';
procedure TForm1.DisplayInfo(const aAccessible : IAccessible; const aOffset : string);
procedure ProcessChild(const aChild : OleVariant);
var
ChildAccessible : IAccessible;
ChildDispatch : IDispatch;
begin
ChildDispatch := nil;
case VarType(aChild) of
varInteger : aAccessible.Get_accChild(aChild, ChildDispatch);
varDispatch : ChildDispatch := aChild;
end;
if (ChildDispatch <> nil) and (ChildDispatch.QueryInterface(IAccessible, ChildAccessible) = S_OK) then
DisplayInfo(ChildAccessible, aOffset + ' ')
end;
var
Child, CurrentChild : OleVariant;
ChildArray : array of OleVariant;
dwNum : DWord;
Enum : IEnumVARIANT;
i, iChildCount, iObtained : Integer;
wsText : WideString;
begin
if aAccessible <> nil then begin
if aAccessible.get_AccName(CHILDID_SELF, wsText) = S_OK then
Memo1.Lines.Add(aOffset + 'Name: ' + wsText)
else
Memo1.Lines.Add(aOffset + 'Name: Empty');
if aAccessible.get_AccValue(CHILDID_SELF, wsText) = S_OK then
Memo1.Lines.Add(aOffset + ' Value: ' + wsText);
if aAccessible.get_AccDescription(CHILDID_SELF, wsText) = S_OK then
Memo1.Lines.Add(aOffset + ' Description: ' + wsText);
if (aAccessible.Get_accChildCount(iChildCount) = S_OK) and (iChildCount > 0) then begin
Form1.Memo1.Lines.Add(aOffset + ' Children: ' + IntToStr(iChildCount));
SetLength(ChildArray, iChildCount);
if AccessibleChildren(Pointer(aAccessible), 0, iChildCount, ChildArray[0], iObtained) = S_OK then begin
for i := 0 to iObtained - 1 do
ProcessChild(ChildArray[i])
end else if aAccessible.QueryInterface(IEnumVARIANT, Enum) = S_OK then begin
Enum := aAccessible as IEnumVARIANT;
for i := 0 to iChildCount - 1 do
if Enum.Next(1, Child, dwNum) = S_OK then
ProcessChild(Child);
end else begin
if aAccessible.accNavigate(NAVDIR_FIRSTCHILD, CHILDID_SELF, CurrentChild) = S_OK then begin
repeat
ProcessChild(CurrentChild)
until aAccessible.accNavigate(NAVDIR_NEXT, CurrentChild, CurrentChild) <> S_OK;
end
end
end
end
end;
-------------------------------------------------------------------------------------
var
Accessible : IAccessible;
hWindow : HWnd;
begin
Memo1.Lines.Clear;
hWindow := FindWindowA('CabinetWClass', nil);
if AccessibleObjectFromWindow(hWindow, 0, IID_IAccessible, Accessible) = S_OK then
DisplayInfo(Accessible, '');
-------------------------------------------------------------------------------------
это окошко хрома выполнено в каком-то другом формате? или в этом коде просто не хватает какой-то специальной команды из DirectUIHWND?
пытался использовать утилитку, которая читает из координат мышки - она тоже не может получить значения этого списка.
может кто разбирается в этом DirectUIHWND и сможет подсказать?