; ; AutoHotkey Version: 1.x ; Language: English ; Platform: Win9x/NT ; Author: Jack Dunning, Jack's AutoHotkey Blog (https://jacks-autohotkey-blog.com/) ; ; /* Script Function: The CopyRef.ahk script copies any selected text to an "Untitled - Notepad" window. The script uses the standard Windows Clipboard manipulation routine discussed in detail at: https://jacks-autohotkey-blog.com/2016/03/23/autohotkey-windows-clipboard-techniques-for-swapping-letters-beginning-hotkeys-part-9/ Be sure to save the Notepad file after copying references. April 21, 2020 Copy text to Notepad, WordPad or GUI Edit field To set up a reference target window tag either a NotePad, WordPad, or GUI Edit field as the target by activating the window, clicking in the target field and pressing: Ctrl+Win+Alt+T Then move to any source window, highlight the targeted text, then press: Ctrl+Alt+C Without activating the target window, the script uses the Control, EditPaste command to insert the text into the window at the cursor location. Uncomment the ControlSetText command to replace rather than add text. Use Ctrl+Win+Alt+R to return to the tagged window. May 3, 2020 Add the GetActiveBrowserURL() function to extract the Web page address, plus use the WinGetActiveTitle command to capture the window title, then send both (URL optional) with preceding semicolon. */ ; Required for the GetActiveBrowserURL() function for determining URL of Web page ModernBrowsers := "ApplicationFrameWindow,Chrome_WidgetWin_0,Chrome_WidgetWin_1,Maxthon3Cls_MainFrm,MozillaWindowClass,Slimjet_WidgetWin_1" LegacyBrowsers := "IEFrame,OperaWindowClass" ^!c:: If !WinTag { MsgBox, Tag a target window in NotePad ,`rWordPad or a GUI edit field:`r`r 1 . Activate window`n 2 . Press Ctrl+Win+Alt+T Return } OldClipboard := ClipboardAll Clipboard := "" ;clears the Clipboard SendInput, ^c ClipWait 0 ; pause for Clipboard data If ErrorLevel { MsgBox, No text selected! Return } sURL := GetActiveBrowserURL() WinGetClass, sClass, A WinGetActiveTitle, RefTitle Control, EditPaste, `; Reference Title: %RefTitle%`r,%control%, ahk_id %WinTag% If (sURL != "") MsgBox,3,, % "Title: " . RefTitle . "`nThe URL is " . sURL . "`rCopy URL to Ref? (Y/N)" IfMsgBox Yes Control, EditPaste, `; %sURL%`r`r,%control%, ahk_id %WinTag% Control, EditPaste, %Clipboard% `n`n ,%control%, ahk_id %WinTag% ; To replace text (rather than add), use the following ControlSetText command: ; ControlSetText , %Control%, %Clipboard%, ahk_id %WinTag% ToolTip , Text inserted into %WinTitle%`rControl: %control%! Sleep, 3000 ToolTip Clipboard := OldClipboard Return ^!#t:: Click, %A_CaretX%, %A_CaretY% MouseGetPos, , , WinTag, Control WinGetTitle, WinTitle, ahk_id %WinTag% MsgBox The "%WinTitle%" window is tagged!`rUnique ID: %WinTag%`rControl: %Control%`rCtrl+Win+Alt+R to activate. Return ^!#r:: WinActivate, ahk_id %WinTag% Return ; GetActiveBrowserURL() function for determining URL of Web page GetActiveBrowserURL() { global ModernBrowsers, LegacyBrowsers WinGetClass, sClass, A If sClass In % ModernBrowsers Return GetBrowserURL_ACC(sClass) Else If sClass In % LegacyBrowsers Return GetBrowserURL_DDE(sClass) ; empty string if DDE not supported (or not a browser) Else Return "" } ; "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, `" ;"; comment to avoid a syntax highlighting issue in autohotkey.com/boards 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 == "") { WinGet, nWindows, List, % "ahk_class " sClass ; In case of a nested browser window as in the old CoolNovo (TO DO: check if still needed) If (nWindows > 1) { accAddressBar := GetAddressBar(Acc_ObjectFromWindow(nWindows2)) Try sURL := accAddressBar.accValue(0) } } If ((sURL != "") and (SubStr(sURL, 1, 4) != "http")) ; Modern browsers omit "http://" sURL := "http://" sURL If (sURL == "") nWindow := -1 ; Don't remember the window if there is no URL Return sURL } ; "GetAddressBar" based in code by uname ; Found at http://autohotkey.com/board/topic/103178-/?p=637687 GetAddressBar(accObj) { Try If ((accObj.accRole(0) == 42) and IsURL(accObj.accValue(0))) Return accObj Try If ((accObj.accRole(0) == 42) and IsURL("http://" accObj.accValue(0))) ; Modern browsers omit "http://" Return accObj For nChild, accChild in Acc_Children(accObj) If IsObject(accAddressBar := GetAddressBar(accChild)) Return accAddressBar } IsURL(sURL) { Return RegExMatch(sURL, "^(?https?|ftp)://(?(?:[\w-]+\.)+\w\w+)(?::(?\d+))?/?(?(?:[^:/?# ]*/?)+)(?:\?(?[^#]+)?)?(?:\#(?.+)?)?$") } ; 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" } }