Что нового

Можно ли скопировать в буфер обмена ссылку над которой находится курсор мыши в Firefox?

hexin

Новичок
Сообщения
19
Репутация
0
Здравствуйте.
Уже не один год мечтаю завести себе скриптик который бы умел копировать в буфер обмена ссылку над которой в данный момент находится курсор мыши по горячей клавише.
Например навёл курсор на ссылку, нажал клавишу контрол и эта ссылка уже в буфере обмене.
Это вообще реализуемо?
Может это уже обсуждалось на форуме, подскажите пожалуйста.
Сообщение автоматически объединено:

Сколько форумчан посмотрело тему и никто даже не написал это возможно сделать средствами Autoit или нет...
печально((
 
Последнее редактирование:

Webarion

Осваивающий
Сообщения
135
Репутация
22
это возможно сделать средствами Autoit или нет
Думаю возможно. UIAutomate возможно вам поможет.
В простом варианте, по горячей клавише, автоматизировать правый клик, и в контекстном меню с помощью AutoIt найти и щёлкнуть пункт "Копировать ссылку" или по горячей клавише.Пример:
Код:
#include <WinApi.au3>

HotKeySet("w", "BrowserLinkCopy") ; запускаем функцию BrowserLinkCopy при клике клавиши w

While 1
    Sleep(100)
WEnd

Func BrowserLinkCopy()
    Local $sTitle = "[class:MozillaDropShadowWindowClass]" ; класс контекстного меню для Firefox версии 89.0.2(x64) от 26.06.2021
    ClipPut("")
    MouseClick("right") ; клик правой
    If Not WinWait($sTitle, "", 1) Then; ожидаем появление контекстного меню Firefox
        Send("{ESC}")
        Return SetError(1, 0, 0)
    EndIf
    Local $hHwnd = WinGetHandle($sTitle)
    _WinAPI_SetKeyboardLayout($hHwnd, 0x0419); так как горячая клавиша для копирования ссылки кириллическая, переключим раскладку

    Send("k") ; горячая клавиша для "Копировать ссылку" в Firefox. Определить можно через UIAutomate Inspect
    Sleep(100)
    Local $sLink = ClipGet()
    Send("{ESC}")
    If Not StringRegExp($sLink, '^\h*https?://.+$') Then Return SetError(2, 0, 0)
    ConsoleWrite("Ссылка: " & $sLink & @CRLF)
EndFunc

c UIAutomate, ещё проще:
Код:
#include <Misc.au3>
#include 'UIAutomate.au3'

; тестировалось на Firefox версии 89.0.2(x64) от 26.06.2021
; не подхватывает ссылку если внутри неё изменён атрибут role. Например: <a role="tab" href="https://autoit-script.ru">AutoIt</a>
While 1
    If _IsPressed("11") Then ; отслеживаем CTRL
        While _IsPressed("11") ; ждём отжатие
            Sleep(250)
        WEnd

        Local $aLink = BrowserLinkCopy() ; запрашиваем ссылку
        If Not @error Then
            ConsoleWrite("Название: " & $aLink[0] & @CRLF)
            ConsoleWrite("Ссылка: " & $aLink[1] & @CRLF)
        EndIf

    EndIf
    Sleep(100)
WEnd

Func BrowserLinkCopy()
    Local $oElement = _UIA_GetElementFromPoint()
    If @error Then Return SetError(1, 0, 0)
    Local $sName = _UIA_ElementGetPropertyValue($oElement, $UIA_NamePropertyId)
    Local $sLink = _UIA_ElementGetPropertyValue($oElement, $UIA_ValueValuePropertyId)
    Local $aRet[2]
    If $sName Then $aRet[0] = $sName
    If $sLink Then $aRet[1] = $sLink
    Return $aRet
EndFunc

Сообщение автоматически объединено:

Ну и ради спортивного интереса. Для нескольких браузеров (проверено на Firefox,Chrome,Opera,Iron). Копирует при клике по ссылке Ctrl+ПКМ:
Код:
#include <Misc.au3>
#include 'UIAutomate.au3'

; нажмите Ctrl + Правую кнопку мыши по ссылке
While 1
    If _IsPressed("02") Then ; ПКМ
        While _IsPressed("02") ; отжата
            Sleep(100)
        WEnd
        If _IsPressed("11") Then ; Ctrl
            Local $sLink = BrowserLinkCopy() ; запрашиваем ссылку
            If Not @error Then
                ConsoleWrite("Ссылка: " & $sLink & @CRLF)
                ToolTip("Ссылка скопирована в буфер обмена")
                AdlibRegister("ClearToolTip", 1000)
            EndIf
        EndIf

    EndIf
    Sleep(10)
WEnd


Func BrowserLinkCopy()
    Local $aClass = ["MozillaDropShadowWindowClass", "Chrome_WidgetWin_2"] ; классы контекстных меню для ["Firefox","Chrome;Opera;Iron"]
    Local $aNames = ["Копировать ссылку", "Копировать адрес ссылки"] ; названия кнопок для ["Firefox","Chrome;Opera;Iron"]
    Local $aPos = MouseGetPos()
    Local $hWnd, $n = 0
    While 1
        For $i = 0 To UBound($aClass) - 1
            Local $sTitle = "[class:" & $aClass[$i] & "]"
            If BitAND(WinGetState($sTitle), 2) Then
                $hWnd = WinGetHandle($sTitle)
                ExitLoop (2)
            EndIf
        Next
        $n += 1
        If $n > 10 Then ExitLoop
        Sleep(100)
    WEnd
    If Not IsHWnd($hWnd) Then Return SetError(1, 0, 0)
    WinSetTrans($hWnd, '', 0)
    $oParent = _UIA_GetElementFromHandle($hWnd)
    If Not @error Then
        $oElement = _UIA_GetControlTypeElement($oParent, "UIA_MenuItemControlTypeId", $aNames[$i])
        If Not @error Then
            ClipPut("")
            _UIA_ElementMouseClick($oElement)
            MouseMove($aPos[0], $aPos[1], 0)
            Sleep(100)
            Local $sLink = ClipGet()
        EndIf
    EndIf
    WinSetTrans($hWnd, '', 255)
    Return $sLink ? $sLink : ""
EndFunc

Func ClearToolTip()
    AdlibUnRegister("ClearToolTip")
    ToolTip("")
EndFunc
 
Последнее редактирование:
Автор
H

hexin

Новичок
Сообщения
19
Репутация
0
Вы пробовали сперва поискать расширения которые решают вашу задачу? И не усложнять. Например, вы пробовали Fast Copy Links?
Спасибо за интересный вариант, я как то совсем с виду выпустил что в лисе есть расширения.
Но что касается именно этого расширения то не совсем то что мне нужно, по-первых там копируется только по Ctrl+C, во-вторых копирование идет и в окошко этого расширения, и в третьх все ссылки накапливаются а это чревато увеличением потребляемой памяти лисой, периодически нужно весь список ссылок очищать, вобщем не совсем то что нужно.
Но за наводку спасибо, мало ли может и такой алгоритм когда нибудь пригодится.
c UIAutomate, ещё проще
А вот это реально то что нужно на 1000000% !
Просто бомба!
Большое спасибо что выделили время и написали этот чудесный код.
Просто идеально всё работает!
Сообщение автоматически объединено:

Для нескольких браузеров (проверено на Firefox,Chrome,Opera,Iron)
UIAutomate + умелые ручки = чудеса !
Я даже не думал что Autoit способен на такое.
Что удивительно, так это то что весь интернет облазил и нигде нет ничего подобного, а ведь это так удобно просто навел курсор, нажал горячую клавишу и вуаля ссылка в буфере и не нужно вызывать меню браузера, искать где там копировать ссылку....
Webarion, cпасибо!
 
Последнее редактирование:

InnI

AutoIT Гуру
Сообщения
4,599
Репутация
1,293
Обнаружение любых ссылок $UIA_HyperlinkControlTypeId

Доступ к элементам страницы в Firefox: _FirefoxAccessInit()
 

Webarion

Осваивающий
Сообщения
135
Репутация
22
Обнаружение любых ссылок $UIA_HyperlinkControlTypeId
Интересно, а есть ли возможность таким образом, потянуть ссылку с установленным атрибутом role? Через контекстное меню конечно топорно, но с задачей справляется.
 

InnI

AutoIT Гуру
Сообщения
4,599
Репутация
1,293
есть ли возможность таким образом, потянуть ссылку с установленным атрибутом role?
Попробуйте и узнаете :wink:

Интерфейсу IUIAutomation нет никакого дела до кода страницы. Браузер сам решает, объект какого типа вернуть. Если это будет "ссылка", значит код "потянет" её. Если будет "вкладка", то нужно смотреть информацию Inspect (возможно, один из дочерних или родительских элементов будет ссылкой).
 

Webarion

Осваивающий
Сообщения
135
Репутация
22
Попробуйте и узнаете
Пробовал. Хотя сама ссылка в браузере и остаётся ссылкой, но её тип при изменении role, перестаёт быть UIA_HyperlinkControlTypeI. Я понял, значит видимо это невозможно. Способ через автоматизацию контекстного меню, для меня, пока остаётся более стабильным.
Сообщение автоматически объединено:

Не согласен с тем, что удалили последнее сообщение автора этой ветки. Оно заслуживает того, чтобы быть здесь, как обратный отклик.
 
Последнее редактирование:

Medic84

Омега
Команда форума
Администратор
Сообщения
1,580
Репутация
335
Поэтому, я выражаю несогласие, с тем, что так в тихую, удалили сообщение автора этой ветки
Никто ничего не удалял. Сработал антиспам Akismet и скрыл сообщение до его дальнейшего одобрения. Из за ссылки в сообщении.
 
Последнее редактирование:
Верх