1 (изменено: panamaboot, 2015-08-06 13:39:11)

Тема: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Появилась идея написать скрипт который будет выполнять следующие действие. Копировать содержание адресной строки браузера в файл отдельной строкой, затем следующий адрес  ( или создавать файл с таким именем), причём это должно повторяться много раз . И производить обратные действия : извлекать строку из файла  (или имя файла) и вставлять в адресную строку , осуществлять переход по адресу , потом следующая строка из файла и т.д.
Подскажите как лучше это реализовать и с помощью каких команд.

Не знаю, не умею, но быстро учусь!

2

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Ну так Ctrl-C/Ctrl-V. Главное — установить фокус на адресную строку, если её показ не отключен. Как это сделать, уже зависит от браузера: если не ошибаюсь в IE переключение на адресную строку и обратно — по F6 (по IE6 включительно — по Ctrl-Tab); в Opera: туда — F8, обратно — F9…

3

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Я бы через acc делал, так как могут возникнуть проблемы с установкой фокуса.
На нашем форуме можно поискать примеры и на оф.форуме тоже.

4

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Ну так как тс имеет ввиду любой браузер, то acc не вполне уместно, как и любой другой вариант. Мало ли какие браузеры бывают...

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

5 (изменено: panamaboot, 2015-08-07 13:36:32)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

А есть ли возможность извлечь ссылку  в буфер обмена , из объекта под курсором. Или  только вариант , правой кнопкой => копировать адрес ссылки.

Не знаю, не умею, но быстро учусь!

6

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

panamaboot пишет:

извлечь имя файла под курсором в тотал командере  или эксплорере ?

А как это связано с заголовком темы?

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

7

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Если у вас Google Chrome.
Скрипт по Ctrl + F1 нажимает ctrl+L (в Chrome выделяет адресную строку),
копирует содержимое и записывает в файл TestAdress.html, он в той же папке где находиться скрипт(если html фала нет, он его создаст).
На Ctrl + F2 открывает TestAdress.html.

#NoEnv
FilePath = %A_ScriptDir%\TestAdress.html ; Место и название создаваемого и дополняемого html файла.

^F1:: ; Ctrl + F1
KeyWait, F1 ; Ждёт пока отпустиш F1.
ClipSaved := ClipboardAll ; Сохраняет содержимое буфера обмена в переменную.
Send {SC01D Down}{SC026}{SC01D Up} ; Ctrl + L (Google Chrome по ней выделяет адрессную строку).
; Для других браузеров нужно посылать другие горячие клавиши.
Send {SC01D Down}{SC02E}{SC01D Up} ; ctrl + C
AdrUrl := Clipboard ; Сохраняет в переменную адресс из буфера обмена.
Clipboard := ClipSaved ; Восстанавливает клипборд.
ClipSaved = ; Освобождает память, когда клипборд громоздок.
FileAppend,<DT><A HREF="%AdrUrl%" =">%AdrUrl%</A>    </DL><p>`n, %FilePath% ; Дописывает в html файл.
Return

^F2:: ; Ctrl + F2
KeyWait, F2 ; Ждёт пока отпустиш F2.
Run, %FilePath% ; Открывает html файл.
Return

8

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

А есть ли возможность извлечь ссылку  в буфер обмена , из объекта под курсором. Или  только вариант , правой кнопкой => копировать адрес ссылки.

Без курсора в Chrome.
Нужна библиотека acc.ahk

hwndChrome := WinExist("ahk_class Chrome_WidgetWin_1")
AccChrome := Acc_ObjectFromWindow(hwndChrome)
AccAddressBar := GetElementByName(AccChrome, "Address and search bar")
MsgBox % AccAddressBar.accValue(0)

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj
   
   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}

9

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

У меня так работает:

AccAddressBar := GetElementByName(AccChrome, "Адресная строка и строка поиска")

От языка системы зависит, наверно.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

10 (изменено: Alectric, 2015-08-08 22:25:53)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Для Chrome вот такой метод можно использовать:


#include,%a_scriptdir%\Acc.ahk
#SingleInstance,Force

f5::
path=4.1.2.3.2.5.3
hwnd:=GetIDChrome()
URL:=Acc_Get("value",path,0,"ahk_id " hwnd)

msgbox,% hwnd "`n`n" URL
return

GetIDChrome(Notification="") ; Notification - 1 для взаимодействия с окном оповещения Chrome, с основным окном - 0
{
  WinGet,List,list,ahk_class Chrome_WidgetWin_1
  Loop,% List
  {
    wingettitle,Title,% "ahk_id " List%a_index%
    if (Title="" and Notification)
      return List%a_index%
    else if (Title!="" and !Notification)
      return List%a_index%
  }
}

Возможно, можно и с другими окнами так работать - нужно указать hwnd и "путь", который берется с помощью Accessible Info Viewer (для взаимодействия с окном оповещения путь должен начинаться с "4.1.", дальше - то что покажет Viewer).

Требуется библиотека Acc.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

11

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Можно ведь через роль искать адресную строку.
Ниже скрипт копирует содержимое адресной строки в буфер, работает с 4мя браузерами(можно и свой добавить если нету. В первой строчке через | прописаны классы окон браузеров).
Для копирования нажать левый виндовс.

browsers_class := "YandexBrowser_WidgetWin_1|Chrome_WidgetWin_1|IEFrame|MozillaWindowClass"
SetWinDelay -1

lwin::
hwnd := WinAcTive("A")
WinGetClass Ou_class,% "ahk_id " hwnd
if !(Ou_class ~= "^" browsers_class "$")
    return

url := FindObjByRole( Acc_ObjectFromWindow(hwnd) ,42,1)[1].AccValue(0)
Clipboard := url
tooltip % "Скопировано: " url
return


FindObjByRole(AccObj, role,new=0) {
Static listobj_find := []
% (new) and (listobj_find := [])
   try if (AccObj.accRole(0) = role) and (AccObj.AccValue(0) != "")
      listobj_find.Insert(AccObj)
   
   for k, v in Acc_Children(AccObj)
     try if IsObject(obj := FindObjByRole(v, role)) and (obj.AccValue(0) != "")
         listobj_find.Insert(obj)
return listobj_find
}

;Нужные функции Из Acc для работы скрипта.
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) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
    try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}

Acc_Error(p="") {
    static setting:=0
    return p=""?setting:setting:=p
}

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"
    }
    if Acc_Error()
        throw Exception(ErrorLevel,-1)
}

Нужные функции Acc для работы скрипта уже вшиты.

12

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Только он у тебя тормозит. В фаерфоксе 10 секунд ищет, В IE вообще не нашел.

13

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Для каждого браузера надо сделать свою метку на которую переходить по классу окна. Например для IE перебирать все Acc, это очень нехорошо при наличии "нормального" метода. Думаю что и для остальных браузеров надо использовать индивидуальные подходы.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

14 (изменено: Alectric, 2015-08-11 20:59:02)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Для InternetIsportil:


f1::
ControlGetText,URL,Edit1,ahk_exe iexplore.exe ahk_class IEFrame
msgbox,% URL
return

Для FireFox:

f5::
path=4.21.3.2
hwnd:=winexist("a")
URL:=Acc_Get("value",path,0,"ahk_id " hwnd)

msgbox,% hwnd "`n`n" URL
return
Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

15

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

path=4.21.3.2

Этот вариант не верен, так как у каждого путь свой.
Правильней действовать аналогично коду в 8 сообщении.

16

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Тоже не пойдёт, у меня например accName не "Address and search bar".

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

17 (изменено: Alectric, 2015-08-12 06:49:59)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Malcev пишет:

Этот вариант не верен, так как у каждого путь свой.

Скорей всего из-за того, что я использовал "Portable" версию (39.какая-то) для проверки, не хотел устанавливать полную версию.
Укажи свой путь и пусть другие у кого есть этот браузер проверят его правильность. Или ты уже просмотрел на разных компах через info wiver?

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

18

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Проверял на 2 компах.
На одном: path=4.24.3.2
На втором: path=4.26.3.2

Тоже не пойдёт, у меня например accName не "Address and search bar".

Можно сделать несколько вариантов в зависимости от локализации.

19

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Да и вообще, зачем изобретать велосипед?
http://www.autohotkey.com/board/topic/1 … owser-tab/

20

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

А есть ли способ как-то отличать адресную строку браузера (которые обычно без контрола), чтобы, к примеру, клик в пределах неё производил некое действие?

21

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

http://forum.script-coding.com/viewtopic.php?id=9480

22 (изменено: DD, 2018-04-30 15:15:17)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Скрипты по ссылке вроде на контролы и текст реагируют, тогда как в адресной строке не за что зацепиться (в частности, в Хроме).

23 (изменено: DD, 2018-04-30 15:28:26)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Будет ли юзабельным отслеживать изменение курсора на определенной высоте окна, в пределах панели инструментов браузера? Как раз в адресной строке он принимает форму, готовую к выделению текста?

24 (изменено: DD, 2018-04-30 16:34:04)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Вроде ничё так получилось)). Единственно не смог понять, как регулировать верхнюю границу — чтобы немного спустить? У меня она едва достигает адресной строки —


CoordMode, Mouse
#If WinActive ("ahk_exe chrome.exe") && (Area := WhatArea()) && (A_Cursor = "IBeam")
~LButton:: 
    If Area = 4
        tooltip 111111111111111111
    Else If Area = 5
        tooltip 22222222222222
    Return
#If
   
WhatArea()  {
    Static R := [[0.0,0.5,0.05,1]
                , [0.0,0.05,0.05,0.5]
                , [0.0,0.0,0.05,0.05]
                , [0.05,0.0,0.5,0.05]
                , [0.5,0.0,1,0.05]]
    MouseGetPos, X, Y
    X := X / A_ScreenWidth, Y := Y / A_ScreenHeight
    For K, V in R
        If (X >= V[1] && X <= V[3] && Y >= V[2] && Y <= V[4])
            Return K
} 

На случай клика ниже адресной строки — можно добавить условие для контрола основного окна браузера. В скрипте различается правая и левая половины адресной строки — то есть, можно проводить в два раза больше действий)).

25

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

DD пишет:

Скрипты по ссылке вроде на контролы и текст реагируют, тогда как в адресной строке не за что зацепиться (в частности, в Хроме).

У меня в хроме  в адресной строке ahkspy показывает acc name - Address and search bar.

26 (изменено: DD, 2018-04-30 16:50:15)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Точно, название есть — в первый раз смотрел встроенным AU3_Spy.exe)). Но тут еще контрол используется, которого в Хроме нет и закомментирование результатов не даёт:


#If IsHomeKey()
LButton:: tooltip 11111111111111
#If

IsHomeKey() { 
    MouseGetPos, , , WinId, ControlNN 
    if !InStr( ControlNN, "ToolbarWindow")
        return 0
    WinGet, Process, ProcessName, ahk_id %WinId%
    if Process != chrome.exe 
        return 0
    return GetTextUnderMouse() = "Адресная строка и строка поиска" ? 1 : 0
} 

GetTextUnderMouse()  {
    Static h
    If !h
        h := DllCall("LoadLibrary","Str","oleacc","Ptr")
    If DllCall("oleacc\AccessibleObjectFromPoint"
                , "Int64", DllCall("GetCursorPos","Int64*",pt)+pt
                , "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
    Acc:=ComObjEnwrap(9,pacc,1), child:=NumGet(varChild,8,"UInt")
    try value := Acc.accValue(child)
    if value =
        try value := Acc.accName(child) 
    return value
}

27 (изменено: Malcev, 2018-04-30 20:03:08)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

У меня почему-то при директиве #If AccessibleObjectFromPoint выдает неверный результат.
Попробуйте навести мышку на адрессную строку и понажимать f10, f11.

#If !test()
f10:: return 
#If
return

f11::test()
return

test()
{
tooltip % Acc_c(child).accName(child)
}

Acc_c(ByRef _idChild_ = "", x = "", y = "")
{
	Static	h
	If Not	h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
	If	DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
	Return	ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}

А так вообще ошибку выдаёт:

Error 0x8001010D - An outgoing call cannot be made since the application dispatching an input-synchronous call

#If !test()
f10:: return 
#If
return


test()
{
hwndChrome := WinExist("ahk_class Chrome_WidgetWin_1")
AccChrome := Acc_ObjectFromWindow(hwndChrome)
AccAddressBar := GetElementByName(AccChrome, "Address and search bar")
}

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj
   
   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}
+ DD

28

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

То же самое — первый работает с директивой и без, а второй — никак. А что если считывание текста из строки адреса сочетать с проверкой формы курсора? Или если возможно — наличием полосы прокрутки справа, тогда без настроек это работало бы во всех браузерах?

29

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

DD пишет:

первый работает с директивой и без

С директивой работает неправильно.
Вам остаётся объединить 26 код с 27, но не использовать директиву а проверять куда был совершен клик после нажатия левой кнопки мыши.
Ну или ждать, что ответят на оффоруме.
Я написал там об  этом.

30

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Не понял, как там все это работает. Наверное, подожду, спасибо.

31 (изменено: Malcev, 2018-05-01 09:37:48)

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

Там если и ответят, то только на вопрос почему acc не работает с директивой.
Так попробуйте:

LButton::
if test()
   tooltip 11111111111111
else
{
   Click Down
   Keywait, LButton
   Click Up
}

test()
{
   Critical
   MouseGetPos, , , WinId, ControlNN
   WinGet, Process, ProcessName, ahk_id %WinId%
   if (Process = "chrome.exe")
      Control := "", name := "Address and search bar"
   else if (Process = "firefox.exe")
      Control := "", name := "Search or enter address"
   else
      return 0
   if (ControlNN != Control)
      return 0
   if (Acc_c(child).accName(child) = name)
      return 1
}

Acc_c(ByRef _idChild_ = "", x = "", y = "")
{
	Static	h
	If Not	h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
	If	DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""?0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0
	Return	ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}
+ DD

32

Re: AHK: Копирование адресной строки браузера и дальнейшая работа с ней

В общем с #If существуют ограничения, так что код из 31 поста, наверное, единственный способ.
https://autohotkey.com/boards/viewtopic … mp;t=48444