Delete tab in Firefox using ahk
Posted: 27 Nov 2021, 06:21
I want to delete specific tabs in Firefox by title contents programmatically.
Any ideas would be great
Many thanx
Any ideas would be great
Many thanx
Let's help each other out
https://www.autohotkey.com/boards/
https://www.autohotkey.com/boards/viewtopic.php?f=76&t=97125
Code: Select all
if !AccFF := AccObjectFromWindow( hWnd := WinExist("ahk_class MozillaWindowClass") )
throw "Failed to get accessible object from FF"
AccTabList := SearchElement(AccFF, {Role: ROLE_SYSTEM_PAGETABLIST := 0x3C})
WinActivate
Loop % AccTabList.accChildCount() - 1 {
AccTab := AccTabList.accChild(A_Index)
AccTab.accDoDefaultAction(0)
MsgBox, % AccTab.accName(0)
}
SearchElement(parentElement, params)
{
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) {
if ComObjType(Acc, "Name") != "IAccessible" {
ErrorLevel := "Invalid IAccessible Object"
Return
}
try childCount := Acc.accChildCount
if !childCount
Return
Children := []
VarSetCapacity(varChildren, childCount*(8 + A_PtrSize*2), 0)
res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
, "Int", childCount, "Ptr", &varChildren, "IntP", childCount)
if (res != 0) {
ErrorLevel := "winapi AccessibleChildren failed"
Return
}
Loop % childCount {
offset := (A_Index - 1)*(A_PtrSize*2 + 8)
_child := NumGet(varChildren, offset + 8)
if NumGet(varChildren, offset) != (VT_DISPATCH := 9)
child := _child
else
child := AccQuery(_child), ObjRelease(_child)
Children.Push(child)
}
Return 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)
}
Code: Select all
#Include d:\utils\acc\Acc.ahk ; https://www.autohotkey.com/boards/viewtopic.php?t=40590
#Include d:\utils\firefoxLib.ahk ; https://www.autohotkey.com/boards/viewtopic.php?p=294316#p294316
closeTabs("AutoHotkey")
closeTabs(name) { ; Close Firefox tabs
If !hWnd := WinExist("ahk_exe firefox.exe")
Return
tab := []
For each, tabName in StrSplit(JEE_FirefoxGetTabNames(hWnd), "`n") {
If !Instr(tabname, name)
Continue
JEE_FirefoxFocusTabByName(hWnd, tabName)
Sleep, 500
ControlSend, ahk_parent, {Ctrl down}w{Ctrl up}, ahk_id %hWnd%
}
}
I cannot find firefoxlib.ahk in above board post#Include d:\utils\firefoxLib.ahk ; viewtopic.php?p=294316#p294316
You need to change the Loop like this:
Code: Select all
wordToClose := "AutoHotkey"
Loop % AccTabList.accChildCount() - 1 {
AccTab := AccTabList.accChild(A_Index)
if InStr(AccTab.accName(0), wordToClose) {
AccTab.accDoDefaultAction(0) ; switch to the tab containing %wordToClose%
Send ^w ; close that tab
break
}
}