1 (изменено: Michael, 2021-12-14 22:06:53)

Тема: AHK: Обновление определенной вкладки в браузере Mozilla.

Приветствую!

Суть скрипта, который хочу сделать, такова:
Разворачивается окно браузера Mozilla, ищется нужная вкладка по названию, как только нашлась - посылается F5 (обновить страницу) и так должно быть каждый час.
Написать получилось пока вот так:

~F8::
SetTitleMatchMode, 2
WinActivate, - Mozilla Firefox
SetTitleMatchMode, 1
If WinExist("Мои сообщения")
    WinActivate
else {
    searchedTab := "Мои сообщения"
    WinGetActiveTitle, StartingTitle
    loop{
        send {Control down}{Tab}{Control Up}
        Sleep 400
        IfWinActive, %SearchedTab%
			Send {F5}
            Return
        WinGetActiveTitle, CurrentTabTitle
        If (CurrentTabTitle == StartingTitle)
            return
    }
}
Return

Проблемы: надо тыкать каждый раз F8, чтобы он листал вкладки, нужную обновляет, как только "натыкаю" на неё. Также пока-что нету таймера на скрипт, чтобы выполнял раз в час.
Заранее спасибо за помощь и советы.

2

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Ну такой себе вариант как по мне. Вроде библиотека же есть для хрома?

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

3

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

__Михаил__
Так у меня Мозилла, да и делал максимально простой вариант, из того, что умею...

4

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Вообще обычно подобные страницы обновляются самостоятельно. Ваша не обновляется?

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

5

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Michael пишет:

Проблемы: надо тыкать каждый раз F8, чтобы он листал вкладки, нужную обновляет, как только "натыкаю" на неё. Также пока-что нету таймера на скрипт, чтобы выполнял раз в час.

Вам просто нужно не нажимать каждый час вручную клавишу F8? Для этого есть цикл Loop, либо таймер SetTimer.

6

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

teadrinker пишет:

Вообще обычно подобные страницы обновляются самостоятельно. Ваша не обновляется?

К сожалению - нет. Проверено.

ypppu пишет:
Michael пишет:

Проблемы: надо тыкать каждый раз F8, чтобы он листал вкладки, нужную обновляет, как только "натыкаю" на неё. Также пока-что нету таймера на скрипт, чтобы выполнял раз в час.

Вам просто нужно не нажимать каждый час вручную клавишу F8? Для этого есть цикл Loop, либо таймер SetTimer.

Нене, скрипт кривой у меня, нажатие F8 перелистывает только 1 вкладку, а мне надо чтобы искало до нужной вкладки из всех открытых, как только нашло - обновило страницу эту, и далее через час тоже самое. И так до бесконечности.

7

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

global searchTab := "Мои сообщения"

setTimer, functionName, % 1 * 60 * 60 * 1000 ; hour * minutes * seconds * ms
return

F8::
functionName()
return

functionName()
{
	SetTitleMatchMode, 2
	WinActivate, - Mozilla Firefox
	SetTitleMatchMode, 1
	
	If WinExist("Мои сообщения")
	{
		WinActivate
		return
	}
	
	WinGetActiveTitle, startTitle
	
	loop
	{
		send {Ctrl down}{Tab}{Ctrl Up}
		Sleep 400
		WinGetActiveTitle, currTitle
	
		if (currTitle ~= searchedTab)
		{
			Send, {F5}
			return
		}
		else if (startTitle == currTitle)
		{
			return
		}
	}
}
Win10: LTSC (21H2); AHK: ANSI (v1.1.36.02)

8

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Phoenixxx_Czar
Первый раз находит и обновляет нужную страницу - далее обновляет рандомные страницы в браузере, не пойму почему

9

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Selenium или webdriver.
Все это уже перенесено на автохотки.

10

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Переключиться на вкладку в FF по заголовку можно так:

FF_ActivateTabByName("Мои сообщения")

FF_ActivateTabByName(tabName) {
   static ROLE_SYSTEM_PAGETAB     := 0x25
        , ROLE_SYSTEM_PAGETABLIST := 0x3C
   if !hFF := WinExist("ahk_class MozillaWindowClass")
      throw "Firefox window not found"
   if !AccFF := AccObjectFromWindow(hFF)
      throw "Failed to get accessible object from FF"
   if !AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST})
      throw "Failed to get accessible object from tablist"
   for k, v in AccChildren(AccTabList) {
      if (v.accRole(0) = ROLE_SYSTEM_PAGETAB && v.accName(0) = tabName && found := v)
         break
   }
   if !found
      throw "Page not found"
   WinActivate
   found.accDoDefaultAction(0)
}

SearchElement(parentElement, params)
{ ; params — object like {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "5"}
   found := true
   for k, v in params {
      try {
         if (k = "State")
            (!(parentElement.accState(0)    & v) && found := false)
         else if (k ~= "^(Name|Value)$")
            (!(parentElement["acc" . k](0) ~= v) && found := false)
         else if (k = "ChildCount")
            (parentElement["acc" . k]      != v  && found := false)
         else
            (parentElement["acc" . k](0)   != v  && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF, AccObject := 0
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      AccObject := ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
   Return AccObject
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      try cChildren := Acc.accChildCount
      catch
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

teadrinker
Да, переключает на нужную вкладку, но не могу сюда же прикрутить то, что изначально было нужно, посыл нажатия ф5, и таймер на час..

12

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Почему не можете?

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

13

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Потому что у меня вот такая "хрень" получилась:

setTimer, FF_ActivateTabByName, % 1 * 1 * 1 * 1000 ; hour * minutes * seconds * ms
return

F8::
FF_ActivateTabByName()
return

FF_ActivateTabByName()
{
FF_ActivateTabByName("Мои сообщения")

FF_ActivateTabByName(tabName) {
   static ROLE_SYSTEM_PAGETAB     := 0x25
        , ROLE_SYSTEM_PAGETABLIST := 0x3C
   if !hFF := WinExist("ahk_class MozillaWindowClass")
      throw "Firefox window not found"
   if !AccFF := AccObjectFromWindow(hFF)
      throw "Failed to get accessible object from FF"
   if !AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST})
      throw "Failed to get accessible object from tablist"
   for k, v in AccChildren(AccTabList) {
      if (v.accRole(0) = ROLE_SYSTEM_PAGETAB && v.accName(0) = tabName && found := v)
         break
   }
   if !found
      throw "Page not found"
   WinActivate
   found.accDoDefaultAction(0)
}

SearchElement(parentElement, params)
{ ; params — object like {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "5"}
   found := true
   for k, v in params {
      try {
         if (k = "State")
            (!(parentElement.accState(0)    & v) && found := false)
         else if (k ~= "^(Name|Value)$")
            (!(parentElement["acc" . k](0) ~= v) && found := false)
         else if (k = "ChildCount")
            (parentElement["acc" . k]      != v  && found := false)
         else
            (parentElement["acc" . k](0)   != v  && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF, AccObject := 0
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      AccObject := ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
   Return AccObject
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      try cChildren := Acc.accChildCount
      catch
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}
Send, {F5}
}

Выдает ошибку:

==> Functions cannot contain functions.
     Specifically: FF_ActivateTabByName(tabName)

14

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Вам не нужно по таймеру запускать весь мой код целиком, вам нужно только вызывать функцию.

FF_ActivateTabByName("Мои сообщения")

Читайте про функции в справке.

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

15

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Michael, а зачем вам вообще все это надо?

16

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

teadrinker пишет:

Читайте про функции в справке.

Получилось вот так (разворачивает окно браузера, открывает нужную вкладку и обновляет страницу при нажатии F8):

F8::
FF_ActivateTabByName("Мои сообщения")
Sleep, 200
Send, {F5}
return

FF_ActivateTabByName(tabName) {
   static ROLE_SYSTEM_PAGETAB     := 0x25
        , ROLE_SYSTEM_PAGETABLIST := 0x3C
   if !hFF := WinExist("ahk_class MozillaWindowClass")
      throw "Firefox window not found"
   if !AccFF := AccObjectFromWindow(hFF)
      throw "Failed to get accessible object from FF"
   if !AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST})
      throw "Failed to get accessible object from tablist"
   for k, v in AccChildren(AccTabList) {
      if (v.accRole(0) = ROLE_SYSTEM_PAGETAB && v.accName(0) = tabName && found := v)
         break
   }
   if !found
      throw "Page not found"
   WinActivate
   found.accDoDefaultAction(0)
}

SearchElement(parentElement, params)
{ ; params — object like {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "5"}
   found := true
   for k, v in params {
      try {
         if (k = "State")
            (!(parentElement.accState(0)    & v) && found := false)
         else if (k ~= "^(Name|Value)$")
            (!(parentElement["acc" . k](0) ~= v) && found := false)
         else if (k = "ChildCount")
            (parentElement["acc" . k]      != v  && found := false)
         else
            (parentElement["acc" . k](0)   != v  && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF, AccObject := 0
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      AccObject := ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
   Return AccObject
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      try cChildren := Acc.accChildCount
      catch
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}

Если не нужно запускать по таймеру, то как сделать вызов данной функции раз в час, допустим?

Malcev
В двух словах: есть сайт, страница которого если будет просто открыта без активности - будет "офлайн статус" либо периодически даже разлогинивается.
Самый просто способ (и рабочий, проверено), это прожимать просто обновление страницы, хотя бы раз в 30 или 60 минут. Вкладок у меня много, поэтому нужен поиск среди них.

17

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Michael пишет:

Если не нужно запускать по таймеру, то как сделать вызов данной функции раз в час, допустим?

Не совсем понял вопрос. Почему может быть не нужно запускать по таймеру? Таймер как раз подойдёт в данном случае.

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

18

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

teadrinker
Выполняет код только единожды, а не каждую секунду. Но я вроде где-то на верном пути...)

setTimer, Start, % 1 * 1 * 1 * 1000

Start:
FF_ActivateTabByName("Мои сообщения")
Sleep, 200
Send, {F5}
return

FF_ActivateTabByName(tabName) {
   static ROLE_SYSTEM_PAGETAB     := 0x25
        , ROLE_SYSTEM_PAGETABLIST := 0x3C
   if !hFF := WinExist("ahk_class MozillaWindowClass")
      throw "Firefox window not found"
   if !AccFF := AccObjectFromWindow(hFF)
      throw "Failed to get accessible object from FF"
   if !AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST})
      throw "Failed to get accessible object from tablist"
   for k, v in AccChildren(AccTabList) {
      if (v.accRole(0) = ROLE_SYSTEM_PAGETAB && v.accName(0) = tabName && found := v)
         break
   }
   if !found
      throw "Page not found"
   WinActivate
   found.accDoDefaultAction(0)
}

SearchElement(parentElement, params)
{ ; params — object like {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "5"}
   found := true
   for k, v in params {
      try {
         if (k = "State")
            (!(parentElement.accState(0)    & v) && found := false)
         else if (k ~= "^(Name|Value)$")
            (!(parentElement["acc" . k](0) ~= v) && found := false)
         else if (k = "ChildCount")
            (parentElement["acc" . k]      != v  && found := false)
         else
            (parentElement["acc" . k](0)   != v  && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF, AccObject := 0
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      AccObject := ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
   Return AccObject
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      try cChildren := Acc.accChildCount
      catch
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}

19

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Код завершается, когда доходит до первого Return. Этого не происходит в следующих случаях:

  • Где-то в коде есть директива #Persistent

  • В коде есть горячая клавиша

  • В коде есть GUI

  • В коде есть функция OnMessage()

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

20 (изменено: Malcev, 2021-12-15 23:36:45)

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Malcev
В двух словах: есть сайт, страница которого если будет просто открыта без активности - будет "офлайн статус" либо периодически даже разлогинивается.

Можно посылать WinhttpRequest с нужными кукисами.

21

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

teadrinker пишет:

Код завершается, когда доходит до первого Return. Этого не происходит в следующих случаях:

  • Где-то в коде есть директива #Persistent

  • В коде есть горячая клавиша

  • В коде есть GUI

  • В коде есть функция OnMessage()

Большое спасибо! Получилось:

#Persistent
setTimer, Start, % 1 * 1 * 1 * 1800000

Start:
FF_ActivateTabByName("Мои сообщения")
Sleep, 200
Send, {F5}
return

FF_ActivateTabByName(tabName) {
   static ROLE_SYSTEM_PAGETAB     := 0x25
        , ROLE_SYSTEM_PAGETABLIST := 0x3C
   if !hFF := WinExist("ahk_class MozillaWindowClass")
      throw "Firefox window not found"
   if !AccFF := AccObjectFromWindow(hFF)
      throw "Failed to get accessible object from FF"
   if !AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST})
      throw "Failed to get accessible object from tablist"
   for k, v in AccChildren(AccTabList) {
      if (v.accRole(0) = ROLE_SYSTEM_PAGETAB && v.accName(0) = tabName && found := v)
         break
   }
   if !found
      throw "Page not found"
   WinActivate
   found.accDoDefaultAction(0)
}

SearchElement(parentElement, params)
{ ; params — object like {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: "5"}
   found := true
   for k, v in params {
      try {
         if (k = "State")
            (!(parentElement.accState(0)    & v) && found := false)
         else if (k ~= "^(Name|Value)$")
            (!(parentElement["acc" . k](0) ~= v) && found := false)
         else if (k = "ChildCount")
            (parentElement["acc" . k]      != v  && found := false)
         else
            (parentElement["acc" . k](0)   != v  && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF, AccObject := 0
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      AccObject := ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
   Return AccObject
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
         error := "Invalid IAccessible Object"
         break
      }
      try cChildren := Acc.accChildCount
      catch
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
   try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}

22 (изменено: __Михаил__, 2021-12-16 01:15:23)

Re: AHK: Обновление определенной вкладки в браузере Mozilla.

Michael

Если можно вкладку отделить как в хроме, можно так ещё попробовать:

#SingleInstance Force
#NoEnv

Key = Перезагрузить	; Кнопку, что нужно нажать на странице.
Wait := 5000		; Время для таймера. 3600000 = 1 час (60*60*1000)
Return

F6:: Reload

F2::	; Обновление вкладки по таймеру (перейти на нужную отделить от основных, нажать клавишу).
If !(SW := !SW){
 SetTimer, F5, Off
 I=
 Tool("Обновление вкладки выключено:`n" Title)
 Return
}
WinGetTitle, Title, A
ID := WinExist("A")
Tool(ID "`t" Title)
SetTimer, F5, % Wait

F5:
if B
 B.accDoDefaultAction(0)
Else
 B := Button(Key, Title)
; B := Button(Key, ID)
If (B = 1){
 SetTimer, F5, Off 
 SW := !SW
 Tool("Не удалось получить accessible-object.", 15000,0,0)
 Return
}
If (B = 2){
 SetTimer, F5, Off
 SW := !SW
 Tool("Ошибка! Такой клавиши нет!`n" Key, 15000,0,0)
 Return
}
I++
Tool("Обновили: " I, 2500,0,0)
Return

;-----------------------------------------
;[teadrinker] 12.12.2019	http://forum.script-coding.com/viewtopic.php?id=15091
Button(key_name, wind := "A"){
ListLines, Off
;SendMessage, WM_GETOBJECT := 0x003D, 0, 1, WinExist(wind)
If !accNow := AccObjectFromWindow(WinExist(wind))
 Return	1	; Не удалось получить accessible-object.
If !AccElem := SearchElement(accNow, {Role: ROLE_SYSTEM_PUSHBUTTON := 0x2B, Name: key_name})
 Return 2	; Кнопка не найдена.
AccElem.accDoDefaultAction(0)
Return AccElem 
}

;-------------------------------------------------------------------------------------------------------

SearchElement(parentElement, params){
 ListLines, Off
 found := true
 for k, v in params {
  Try (parentElement["acc" . k](0) != v && found := false)
  catch 
   found := false
 } until !found
 If found
  Return parentElement
 
 for k, v in AccChildren(parentElement)
  If obj := SearchElement(v, params)
   Return obj
}

AccObjectFromWindow(hWnd, idObject = 0){
 ListLines, Off
 Static IID_IDispatch := "{00020400-0000-0000-C000-000000000046}"
    , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
    , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
    , h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
    
 VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
 DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
 If DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
  Return ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
}

AccChildren(Acc){
 ListLines, Off
 Static VT_DISPATCH := 9
 Loop 1{
  If ComObjType(Acc, "Name") != "IAccessible"{
   Error := "Invalid IAccessible Object"
   Break
  }
  cChildren := Acc.accChildCount, Children := []
  VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
  Res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
  If (Res != 0) {
   Error := "AccessibleChildren DllCall Failed"
   Break
  }
  Loop % cChildren{
   i := (A_Index - 1)*(A_PtrSize*2 + 8)
   child := NumGet(varChildren, i + 8)
   Children.Push((b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child)
   (b && ObjRelease(child))
  }
 }
 If Error
  ErrorLevel := Error
 else
  Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc){
 ListLines, Off
 Static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
 Try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}


;-----------------------------------------
Tool(Text, Wait := 1000, X := "", Y := ""){
 SetTimer, T_Off, Off
 ToolTip, % Text, %X%, %Y%
 SetTimer, T_Off, % Wait
 Return
}

~Esc::
T_Off:
SetTimer, T_Off, Off
ToolTip
Return
Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101