1 (изменено: shnec, 2013-01-04 23:24:40)

Тема: AHK: Как активировать вкладку IE через com object ?

Доброе время суток знатоки!
Как цепляться ComObj-ектом к уже открытому  окну \вкладке IE разобрался, а вот как активировать вкладку к которой прицепился  ComObj-ектом не могу разобраться (при условии что открыто несколько окон IE, а в них по несколько вкладок). Подскажите пожалуйста.

Numpad3::

Domen := "yandex.ru" ;

    For Wb in ComObjCreate("Shell.Application").Windows ; 
       If InStr(Wb.FullName, "iexplore.exe" ) and InStr(wb.LocationUrl, "%Domen%" ) ;    
        {              
          ...В этом месте как то нужно активировать и развернуть эту вкладку....          
          break
        }

          LocUrl := wb.LocationURL
          LocName := wb.LocationName        
        
msgbox, % LocUrl "`n" LocName

Через JetTitle c WinActivate - не подходит, потому как страницы могут иметь одинаковое имя.

2

Re: AHK: Как активировать вкладку IE через com object ?

Объект InternetExplorer не даёт возможности перемещаться по вкладкам, можно только открыть URL в новой или в текущей вкладке (если я не прав, пусть кто-то меня поправит).

Для решения этой задачи можно использовать IAccessible interface контролов вкладок. Следующий пример инспектирует окна IE на предмет вкладки, содержащей в адресе "yandex.ru", и если находит, то активирует её.

Domen := "yandex.ru"

For Wb in ComObjCreate("Shell.Application").Windows
   If InStr(Wb.FullName, "iexplore.exe") and InStr(wb.LocationUrl, Domen)
      hIE := Wb.hwnd, Wb := ""
until hIE

if !hIE
{
   MsgBox, Вкладка не найдена!
   return
}

WinGet, ControlList, ControlList, ahk_id %hIE%

ControlName := RegExReplace(ControlList, "is).*(DirectUIHWND\d+).*", "$1")
ControlGet, hwnd, hwnd,, % ControlName, ahk_id %hIE%

Tabs := Acc_ObjectFromWindow(hwnd).accChild(1)

Loop % Tabs.accChildCount
   if InStr(Tabs.accChild(A_Index).accDescription(0), Domen)
   {
      WinActivate, ahk_id %hIE%
      Tabs.accChild(A_Index).accDoDefaultAction(0), Tabs := ""
      break
   }
return

Acc_ObjectFromWindow(hWnd, idObject = -4)
{
   If   DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
      Return   ComObjEnwrap(9,pacc,1)
}

Информация: Acc Library

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder