1

Тема: AHK: Взаимодействие с Chrome

Всем привет.
Нужна ваша помощь.
Задача: Необходимо написать скрипт что бы при нажатии на кнопку открывался гугл хром печатался текс и нажималась кнопка.
Вопрос: Как сделать нажатие кнопки. Enter не пойдет так как это просто пример, по сути нужно что бы нажимались разные кнопки их там около 15.

Пример кода что выдал ГПТ, но он с ahk не особо дружит:

^3::
{
    Run, "C:\Program Files\Google\Chrome\Application\chrome.exe" "https://mail.ru/"
    Sleep 2000  ; Задержка для загрузки страницы (в миллисекундах). Установите нужное значение.
    SendInput, Привет
    ; Находим все кнопки с надписью "Показать" и кликаем на них
    Loop
    {
        IfWinActive, ahk_exe chrome.exe ; Установите здесь нужное имя процесса окна браузера
        {
            
            ControlClick, search-arrow__button, % "ahk_class Chrome_WidgetWin_1" ; Замените "Button1" на нужное идентификаторы класса кнопок
            Sleep 500  ; Задержка между кликами (в миллисекундах). Установите нужное значение.
        }
        Else
        {
            Break
        }
    }
    Return
}

2

Re: AHK: Взаимодействие с Chrome

andrey.a.polyakov.b2c пишет:

Пример кода что выдал ГПТ, но он с ahk не особо дружит

А зачем вы его запостили?

andrey.a.polyakov.b2c пишет:

Как сделать нажатие кнопки

Непонятно, о какой кнопке идёт речь.

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

3

Re: AHK: Взаимодействие с Chrome

teadrinker пишет:

Непонятно, о какой кнопке идёт речь.

Кнопки которые на сайте. Но я уже решил проблему с помощью вставки java скрипта в окно браузера.

4

Re: AHK: Взаимодействие с Chrome

Как правильно послать клавиши Ctrl+Shift+K в неактивное окно Хрома?

#SingleInstance Force
DetectHiddenWindows, On  ; работать со скрытыми окнами
SetTitleMatchMode, 2

WinGet, ActiveWinID, ID, Chrome ahk_class Chrome_WidgetWin_1
ControlSend, Chrome_RenderWidgetHostHWND1, {Ctrl Down}{Shift Down}{sc25}{Shift Up}{Ctrl Up}, ahk_id %ActiveWinID% ; Ctrl+Shift+K

5

Re: AHK: Взаимодействие с Chrome

Правильно так:

ControlSend, ahk_parent, ^+k, ahk_class Chrome_WidgetWin_1 ahk_exe chrome.exe, Chrome Legacy Window

Но в неактивном окне это не сработает.

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

6 (изменено: 1srafel, 2025-03-15 18:19:48)

Re: AHK: Взаимодействие с Chrome

Верно ли, что Хром не поддерживает запуск в скрытом режиме, или как-то иначе надо пробовать? -

Run, "%chrome_path%" https://forum.script-coding.com/,, Hide UseErrorLevel, PID

7

Re: AHK: Взаимодействие с Chrome

Поддерживает, запускайте с ключом --headless.

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

8

Re: AHK: Взаимодействие с Chrome

В итоге хотел в скрытое окно слать хоткей, но не реагирует. В чем может быть недочет в данном коде? Без " --headless" (с видимым окном) он работает -

DetectHiddenWindows, On
SetTitleMatchMode, 2

ChromePath := "E:\chrome\chrome.exe"
URLaddress := "https://forum.script-coding.com/"

  Run, %ChromePath% --headless %URLaddress%,, ,PID ;Hide,PID

  WinWait, ahk_pid %PID%,, 3
  If ErrorLevel
  {
    MsgBox, Не дождались окна
    Return
  }
  Sleep 6000

  WinGet, hwnd, ID, Chrome ahk_class Chrome_WidgetWin_1
  WinActivate, ahk_id %hwnd%
  WinWaitActive, ahk_id %hwnd%
  ControlFocus, ahk_id %hwnd%

  ControlSend, ahk_parent, {Ctrl Down}{Shift Down}{sc25}{Shift Up}{Ctrl Up}, ahk_id %hwnd%
  WinClose, ahk_id %hwnd%

  MsgBox %PID%`n`n%Clipboard%

9

Re: AHK: Взаимодействие с Chrome

Во-первых, скрытое окно не может быть активным, во-вторых, в headless-mode Хром вообще не создаёт окна, даже скрытого.

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

10

Re: AHK: Взаимодействие с Chrome

Значит, взаимодействовать на уровне клавиш, можно только с видимым окном Хрома?

11 (изменено: 1srafel, 2025-03-15 22:03:42)

Re: AHK: Взаимодействие с Chrome

Можно ли теоретически запустить скрытый Хром, где вместо ссылки будет js-букмарклет, который запустит нужную ссылку и нажмет хоткей?

Run, %ChromePath% --headless "javascript:...",, ,PID

12

Re: AHK: Взаимодействие с Chrome

Вы бы лучше сказали, чего конкретно хотите добиться, а не то, как вы именно хотите этого добиться.

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

13 (изменено: 1srafel, 2025-03-15 22:13:48)

Re: AHK: Взаимодействие с Chrome

Есть расширение "Copy Cookies", которое копирует куки со страницы в один клик. По умолчанию расширению назначен хоткей Ctrl+Shift+K. Хотелось бы запускать Хром без видимого окна на определенной интернет странице и выполнять это расширение, чтобы куки этой страницы появлялись в буфере.

14

Re: AHK: Взаимодействие с Chrome

Думаю, нереально.

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

15 (изменено: 1srafel, 2025-03-15 22:37:19)

Re: AHK: Взаимодействие с Chrome

А есть ли способ запустить букмарклет, как ссылку?

Run, %ChromePath% "javascript:(function(){var targetUrl='https://forum.script-coding.com/';window.open(targetUrl)})();",, ,PID

То есть, выполнить такой букмарклет, открывающий веб-страницу:

javascript:(function(){var targetUrl='https://forum.script-coding.com/';window.open(targetUrl)})();

16

Re: AHK: Взаимодействие с Chrome

Да, но только в обычном окне. Такой код запускает js из адресной строки:

js := "(function(){var targetUrl='https://forum.script-coding.com/';window.open(targetUrl)})();"
RunJsFromChromeAddressBar(js)

RunJsFromChromeAddressBar(js, title := "ahk_class Chrome_WidgetWin_1 ahk_exe chrome.exe") {
   static WM_GETOBJECT := 0x3D
        , ROLE_SYSTEM_TEXT := 0x2A
        , STATE_SYSTEM_FOCUSABLE := 0x100000
        , SELFLAG_TAKEFOCUS := 0x1
        , AccAddrBars := []
   
   if !hwnd := WinExist(title) {
      MsgBox Окно Хрома не найдено
      return
   }
   if !AccAddrBars.HasKey(hwnd) {
      SendMessage, WM_GETOBJECT, 0, 1, Chrome_RenderWidgetHostHWND1, ahk_id %hwnd%
      AccChrome := AccObjectFromWindow(hwnd)
      AccAddrBars[hwnd] := SearchElement(AccChrome, {Role: ROLE_SYSTEM_TEXT, State: STATE_SYSTEM_FOCUSABLE})
   }
   AccAddrBar := AccAddrBars[hwnd]
   AccAddrBar.accValue(0) := "javascript:" . js
   Sleep, 100
   AccAddrBar.accSelect(SELFLAG_TAKEFOCUS, 0)
   Sleep, 100
   Loop {
      ControlSend,, {Enter}, ahk_id %hwnd%, Chrome Legacy Window
      Sleep, 200
      if AccAddrBar.accValue(0) != "javascript:" . js
         break
      Sleep, 100
   }
}

SearchElement(parentElement, params)
{
   found := true
   for k, v in params {
      try {
         if (k = "ChildCount")
            (parentElement.accChildCount != v && found := false)
         else if (k = "State")
            (!(parentElement.accState(0) & v) && found := false)
         else
            (parentElement["acc" . k](0) != v && found := false)
      }
      catch 
         found := false
   } until !found
   if found
      Return parentElement
   
   for k, v in AccChildren(parentElement)
      if obj := SearchElement(v, params)
         Return obj
}

AccObjectFromWindow(hWnd, idObject = 0) {
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", "Str", "oleacc", "Ptr")
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
   DllCall("ole32\CLSIDFromString", "Str", idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, "Ptr", &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject, "Ptr", &IID, "PtrP", pAcc) = 0
      Return ComObject(VT_DISPATCH, pAcc, F_OWNVALUE)
}

AccChildren(Acc) {
   static VT_DISPATCH := 9
   Loop 1  {
      if ComObjType(Acc, "Name") != "IAccessible"  {
			error := "Invalid IAccessible Object"
         break
		}
      try cChildren := Acc.accChildCount
      catch
         Return ""
      if !cChildren
         Return
      Children := []
      VarSetCapacity(varChildren, cChildren*(8 + A_PtrSize*2), 0)
      res := DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int", 0
                                                , "Int", cChildren, "Ptr", &varChildren, "IntP", cChildren)
      if (res != 0) {
         error := "AccessibleChildren DllCall Failed"
         break
      }
      Loop % cChildren  {
         i := (A_Index - 1)*(A_PtrSize*2 + 8)
         child := NumGet(varChildren, i + 8)
         Children.Push( (b := NumGet(varChildren, i) = VT_DISPATCH) ? AccQuery(child) : child )
         ( b && ObjRelease(child) )
      }
   }
   if error
      ErrorLevel := error
   else
      Return Children.MaxIndex() ? Children : ""
}

AccQuery(Acc) {
   static IAccessible := "{618736e0-3c3d-11cf-810c-00aa00389b71}", VT_DISPATCH := 9, F_OWNVALUE := 1
	try Return ComObject(VT_DISPATCH, ComObjQuery(Acc, IAccessible), F_OWNVALUE)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Взаимодействие с Chrome

Только зачем такой мудрёный js-код?

js := "window.open('https://forum.script-coding.com/')"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: 1srafel, 2025-03-16 23:11:57)

Re: AHK: Взаимодействие с Chrome

Нашелся скрипт для Tampermonkey, который копирует куки страницы после ее открытия. Но при запуске с ключом "--headless", в скрытом окне, копирование не происходит. Правильно понимаю, что в скрытом режиме расширения не отрабатывают?

19

Re: AHK: Взаимодействие с Chrome

Не пробовал.

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

20 (изменено: 1srafel, 2025-03-16 23:43:10)

Re: AHK: Взаимодействие с Chrome

Видимо, перестали поддерживаться https://stackoverflow.com/questions/453 … extensions.