Last active
July 13, 2023 13:25
-
-
Save tmplinshi/d42223814dd98a4b4caa to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; AutoHotkey Version: AutoHotkey 1.1 | |
; Language: English | |
; Platform: Win7 SP1 / Win8.1 | |
; Author: Antonio Bueno <user atnbueno of Google's popular e-mail service> | |
; Short description: Gets the URL of the current (active) browser tab for most modern browsers | |
; Last Mod: 2014-07-05 | |
Menu, Tray, Icon, % A_WinDir "\system32\netshell.dll", 86 ; Shows a world icon in the system tray | |
#u:: | |
nTime := A_TickCount | |
sURL := GetActiveBrowserURL() | |
WinGetClass, sClass, A | |
If (sURL != "") | |
MsgBox, % "The URL is """ sURL """`nEllapsed time: " (A_TickCount - nTime) " ms (" sClass ")" | |
Else If sClass In IEFrame,MozillaWindowClass,OperaWindowClass,Chrome_WidgetWin_1,Chrome_WidgetWin_0,Maxthon3Cls_MainFrm | |
MsgBox, % "The URL couldn't be determined (" sClass ")" | |
Else | |
MsgBox, % "Not a browser or browser not supported (" sClass ")" | |
Return | |
GetActiveBrowserURL() { | |
WinGetClass, sClass, A | |
If sClass In Chrome_WidgetWin_1,Chrome_WidgetWin_0,Maxthon3Cls_MainFrm | |
Return GetBrowserURL_ACC(sClass) | |
Else | |
Return GetBrowserURL_DDE(sClass) ; empty string if DDE not supported (or not a browser) | |
} | |
; "GetBrowserURL_DDE" adapted from DDE code by Sean, (AHK_L version by maraskan_user) | |
; Found at http://autohotkey.com/board/topic/17633-/?p=434518 | |
GetBrowserURL_DDE(sClass) { | |
WinGet, sServer, ProcessName, % "ahk_class " sClass | |
StringTrimRight, sServer, sServer, 4 | |
iCodePage := A_IsUnicode ? 0x04B0 : 0x03EC ; 0x04B0 = CP_WINUNICODE, 0x03EC = CP_WINANSI | |
DllCall("DdeInitialize", "UPtrP", idInst, "Uint", 0, "Uint", 0, "Uint", 0) | |
hServer := DllCall("DdeCreateStringHandle", "UPtr", idInst, "Str", sServer, "int", iCodePage) | |
hTopic := DllCall("DdeCreateStringHandle", "UPtr", idInst, "Str", "WWW_GetWindowInfo", "int", iCodePage) | |
hItem := DllCall("DdeCreateStringHandle", "UPtr", idInst, "Str", "0xFFFFFFFF", "int", iCodePage) | |
hConv := DllCall("DdeConnect", "UPtr", idInst, "UPtr", hServer, "UPtr", hTopic, "Uint", 0) | |
hData := DllCall("DdeClientTransaction", "Uint", 0, "Uint", 0, "UPtr", hConv, "UPtr", hItem, "UInt", 1, "Uint", 0x20B0, "Uint", 10000, "UPtrP", nResult) ; 0x20B0 = XTYP_REQUEST, 10000 = 10s timeout | |
sData := DllCall("DdeAccessData", "Uint", hData, "Uint", 0, "Str") | |
DllCall("DdeFreeStringHandle", "UPtr", idInst, "UPtr", hServer) | |
DllCall("DdeFreeStringHandle", "UPtr", idInst, "UPtr", hTopic) | |
DllCall("DdeFreeStringHandle", "UPtr", idInst, "UPtr", hItem) | |
DllCall("DdeUnaccessData", "UPtr", hData) | |
DllCall("DdeFreeDataHandle", "UPtr", hData) | |
DllCall("DdeDisconnect", "UPtr", hConv) | |
DllCall("DdeUninitialize", "UPtr", idInst) | |
csvWindowInfo := StrGet(&sData, "CP0") | |
StringSplit, sWindowInfo, csvWindowInfo, `" | |
Return sWindowInfo2 | |
} | |
GetBrowserURL_ACC(sClass) { | |
global nWindow, accAddressBar | |
If (nWindow != WinExist("ahk_class " sClass)) ; reuses accAddressBar if it's the same window | |
{ | |
nWindow := WinExist("ahk_class " sClass) | |
accAddressBar := GetAddressBar(Acc_ObjectFromWindow(nWindow)) | |
} | |
Try sURL := accAddressBar.accValue(0) | |
If (sURL == "") { | |
sURL := accAddressBar.accDescription(0) ; Origin Chip support | |
If (sURL == "") { | |
WinGet, nWindows, List, % "ahk_class " sClass ; In case of a nested browser window as in CoolNovo | |
If (nWindows > 1) { | |
accAddressBar := GetAddressBar(Acc_ObjectFromWindow(nWindows2)) | |
sURL := accAddressBar.accValue(0) | |
} | |
} | |
} | |
If ((sURL != "") and (SubStr(sURL, 1, 4) != "http")) ; Chromium-based browsers omit "http://" | |
sURL := "http://" sURL | |
Return sURL | |
} | |
; "GetAddressBar" based in code by uname | |
; Found at http://autohotkey.com/board/topic/103178-/?p=637687 | |
GetAddressBar(accObj) { | |
Try If ((accObj.accName(0) != "") and IsURL(accObj.accValue(0))) | |
Return accObj | |
Try If ((accObj.accName(0) != "") and IsURL("http://" accObj.accValue(0))) ; Chromium omits "http://" | |
Return accObj | |
Try If (InStr(accObj.accDescription(0), accObj.accName(0)) and IsURL(accObj.accDescription(0))) ; Origin Chip support | |
Return accObj | |
For nChild, accChild in Acc_Children(accObj) | |
If IsObject(accAddressBar := GetAddressBar(accChild)) | |
Return accAddressBar | |
} | |
IsURL(sURL) { | |
Return RegExMatch(sURL, "^(?<Protocol>https?|ftp)://(?:(?<Username>[^:]+)(?::(?<Password>[^@]+))?@)?(?<Domain>(?:[\w-]+\.)+\w\w+)(?::(?<Port>\d+))?/?(?<Path>(?:[^/?# ]*/?)+)(?:\?(?<Query>[^#]+)?)?(?:\#(?<Hash>.+)?)?$") | |
} | |
; The code below is part of the Acc.ahk Standard Library by Sean (updated by jethrow) | |
; Found at http://autohotkey.com/board/topic/77303-/?p=491516 | |
Acc_Init() | |
{ | |
static h | |
If Not h | |
h:=DllCall("LoadLibrary","Str","oleacc","Ptr") | |
} | |
Acc_ObjectFromWindow(hWnd, idObject = 0) | |
{ | |
Acc_Init() | |
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_Query(Acc) { | |
Try Return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) | |
} | |
Acc_Children(Acc) { | |
If ComObjType(Acc,"Name") != "IAccessible" | |
ErrorLevel := "Invalid IAccessible Object" | |
Else { | |
Acc_Init(), cChildren:=Acc.accChildCount, Children:=[] | |
If DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 { | |
Loop %cChildren% | |
i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child): | |
Return Children.MaxIndex()?Children: | |
} Else | |
ErrorLevel := "AccessibleChildren DllCall Failed" | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment