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