Что нового

[Окна, Диалоги] Запуск или активация окна программы из трея

mef-t

Осваивающий
Сообщения
306
Репутация
30
Доброго времени суток.

Помогите запустить программу, агент которой находится в трее.
В частности интересует запуск окна антивируса.
Если еще детальнее, то интересует Eset Nod.

Антивирус работает. Он активен и висит в трее.
Необходимо запустить/активировать его главное окно, или любое другое, относящееся к нему окно.

Следующий вариант не подходит.
Код:
Run('C:\Program Files\ESET\ESET NOD32 Antivirus\egui.exe')

так адрес может быть и другим
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Спасибо. Как то не догадался в этой вязке использовать


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

Просьба подсказать, а если это не NOD, а касперский?
Я пробовал эту связку на работе, на работе каспер и там такой вариант не прошел.

Суть в том, что для касперского запущен именно агент. Это не сам касперский.
А для нода иначе. В трее висит именно программа нода, потому такой вариант и подходит.
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Вот пример клика по иконке в трее, зная текст. На русской Win7 данный пример выводит индикатор громкости.
Код:
#include <GuiToolbar.au3>

Global $tray, $search = "Динамики"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321")
If FindClick($search) Then Exit

ControlClick("[class:Shell_TrayWnd]", "", "Button1")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If Not FindClick($search) Then MsgBox(0, "", "Кнопка с текстом '" & $search & "' не найдена", 7)

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) > 0 Then
      _GUICtrlToolbar_ClickIndex($tray, $i)
      Return 1
    EndIf
  Next
  Return 0
EndFunc
 

k_ok_o_s

Новичок
Сообщения
4
Репутация
0
Вот пример клика по иконке в трее, зная текст. На русской Win7 данный пример выводит индикатор громкости.
Код:
#include <GuiToolbar.au3>

Global $tray, $search = "Динамики"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321")
If FindClick($search) Then Exit

ControlClick("[class:Shell_TrayWnd]", "", "Button1")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If Not FindClick($search) Then MsgBox(0, "", "Кнопка с текстом '" & $search & "' не найдена", 7)

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) > 0 Then
      _GUICtrlToolbar_ClickIndex($tray, $i)
      Return 1
    EndIf
  Next
  Return 0
EndFunc
Можно Вас попросить посмотреть, почему на 10-ке не работает? Пишет - "Кнопка с текстом не найдена"
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
почему на 10-ке не работает?
Потому что тулбар и кнопка имеют другие номера. Да и текст отличается.
Код:
#include <GuiToolbar.au3>

Global $tray, $search = "Speakers"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow323")
If FindClick($search) Then Exit

ControlClick("[class:Shell_TrayWnd]", "", "Button2")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If Not FindClick($search) Then MsgBox(0, "", "Кнопка с текстом '" & $search & "' не найдена", 7)

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) > 0 Then
      _GUICtrlToolbar_ClickIndex($tray, $i)
      Return 1
    EndIf
  Next
  Return 0
EndFunc
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI


Здравствуйте

Пожалуйста, научите, как в трее "один раз быстро нажать правую кнопку мышки" по значку AdGuard, появится меню, "один раз быстро нажать левую кнопку мышки" по строке "Отключить защиту на 30 секунд"

При этом значок AdGuard может быть как в видимом режиме, так и в скрытом режиме

Пока у меня вот такая солянка получается

Код:
#include <GuiToolbar.au3>

; Global $tray, $search = "Динамики"
Global $tray, $search = "AdGuard"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321")
If FindClick($search) Then Exit

ControlClick("[class:Shell_TrayWnd]", "", "Button1")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If Not FindClick($search) Then MsgBox(0, "", "Кнопка с текстом '" & $search & "' не найдена", 7)

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) > 0 Then
      # _GUICtrlToolbar_ClickIndex($tray, $i)
        _GUICtrlToolbar_ClickIndex($tray, $i, "right")
        Send("{DOWN}") ; Эмулирует нажатие клавиши "Стрелка вниз" 1 раз
        Sleep(500) ; Пауза 500 мс
        Send("{DOWN}") ; Эмулирует нажатие клавиши "Стрелка вниз" 1 раз
        Sleep(500) ; Пауза 500 мс
        Send("{DOWN}") ; Эмулирует нажатие клавиши "Стрелка вниз" 1 раз
        Sleep(500) ; Пауза 500 мс
        Send("{ENTER}") ; Эмулирует нажатие клавиши "Enter" 1 раз
        Sleep(500) ; Пауза 500 мс
      Return 1
    EndIf
  Next
  Return 0
EndFunc
Откровенно, прямо - есть или нет возможно красиво, по умному, в меню найти строку с названием "Отключить защиту на 30 секунд" и красиво на этой строке с названием "Отключить защиту на 30 секунд" нажать "один раз быстро нажать левую кнопку мышки"

Спасибо.
 

Вложения

  • 2023-04-05_0005.png
    2023-04-05_0005.png
    7.8 КБ · Просмотры: 2
  • 2023-04-05_0004.png
    2023-04-05_0004.png
    69.7 КБ · Просмотры: 2
  • 2023-04-05_0003.png
    2023-04-05_0003.png
    80 КБ · Просмотры: 2
  • 2023-04-05_0002.png
    2023-04-05_0002.png
    81.4 КБ · Просмотры: 2
  • 2023-04-05_0001.png
    2023-04-05_0001.png
    4.8 КБ · Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
красиво, по умному
Так достаточно красиво? :smile:
Код:
#include <UIAutomate.au3> ; https://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/
#include <GuiToolbar.au3>

Global $tray, $search = "AdGuard", $item = "Отключить защиту на 30 секунд"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321")
If FindClick($search) Then Exit ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)

ControlClick("[class:Shell_TrayWnd]", "", "Button1")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If FindClick($search) Then ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) Then
        _GUICtrlToolbar_ClickIndex($tray, $i, "right")
      Return 1
    EndIf
  Next
  Return 0
EndFunc

Func ItemClick($wnd, $item)
  Local $hWnd = WinGetHandle($wnd)
  Local $oMenu = _UIA_GetElementFromHandle($hWnd)
  Local $oItem = _UIA_GetControlTypeElement($oMenu, "UIA_MenuItemControlTypeId", $item)
  If _UIA_ElementGetPropertyValue($oItem, "IsEnabled") Then
    _UIA_ElementDoDefaultAction($oItem)
  Else
    ControlSend($hWnd, "", "", "{esc}")
  EndIf
EndFunc
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI


Здравствуйте

Прошу прощения за длительный ответ

Откровенно - максимально хочется БЕЗ подключения дополнительных файлов, БЕЗ строк


Я Вас очень прошу, в Вашем примере возможно или нет БЕЗ использования
обойтись?

Повторюсь, максимально хочется соовсем БЕЗ подключения дополнительных файлов, БЕЗ строк

 

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
А соовсем без Вашей строки НЕ обойтись?
Должна быть установлена полная версия SciTE

В самое начало скрипта добавляете строку
Код:
#AutoIt3Wrapper_Run_Au3Stripper=y

В меню "Tools" выбираете пункт "Compile". В появившемся окне нажимаете "Compile Script".
В папке с вашим скриптом появится au3-файл с добавкой "_stripped" в имени. В самом конце этого файла находится код скрипта, а перед ним всё необходимое из подключённых UDF. То есть этому скрипту уже не нужны #include.
 

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI


Здравствуйте

1) Спасибо Вам за науку, что учите, объясняете

Попробую и напишу Вам, получилось у меня или нет!

Просьба не обижаться, но максимально хочется готовый, самодостаточный скрипт, так сказать - внутри одного файла включено все.

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

2) Зашел по ссылке
загрузил файл
SciTE4AutoIt3.exe
установил файл
SciTE4AutoIt3.exe
запустил SciTE
внутри SciTE открыл мой скрипт
выбрал как
Tools - Compile
и
Tools - Build
- внутри окна кракозябры, похоже на ошибку к папке "C:\Program...." (типа пробел в названии папки Program Files)
- рядом со скриптом Line_5_0012.au3, естественно, НЕ появилось с добавкой "_stripped"

Вы меня, извините, пожалуйста, любезно, а нет ли готовой сборки, можно в личные сообщения, чтобы у меня всё получилось?

Сколько хочется - установил или распаковал готовую сборку и на выходе получил с добавкой "_stripped"

Видео прилагаю - Запись_2023_04_16_14_18_03_385.mp4.zip

2) Немного модифицировал Вашу версию - добавив, мягко сказать, защиту от "редиски", лишь бы сработало, чтобы пользователь не помешал

Код:
#include <UIAutomate.au3> ; https://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/
#include <GuiToolbar.au3>

BlockInput ( 1 )
Sleep ( 1000 )

Global $tray, $search = "AdGuard", $item = "Отключить защиту на 30 секунд"

$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321")
If FindClick($search) Then Exit ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)

ControlClick("[class:Shell_TrayWnd]", "", "Button1")
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321")
If FindClick($search) Then ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)

BlockInput ( 0 )
Sleep ( 1000 )

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) Then
        _GUICtrlToolbar_ClickIndex($tray, $i, "right")
      Return 1
    EndIf
  Next
  Return 0
EndFunc

Func ItemClick($wnd, $item)
  Local $hWnd = WinGetHandle($wnd)
  Local $oMenu = _UIA_GetElementFromHandle($hWnd)
  Local $oItem = _UIA_GetControlTypeElement($oMenu, "UIA_MenuItemControlTypeId", $item)
  If _UIA_ElementGetPropertyValue($oItem, "IsEnabled") Then
    _UIA_ElementDoDefaultAction($oItem)
  Else
    ControlSend($hWnd, "", "", "{esc}")
  EndIf
EndFunc

Итого - мышка и клавиатура блокируются после запуска ехе файла, но скрипт НЕ срабатывает, получается, скрипт не может нажать правую кнопку мышки на значке

3) Предполагаю, что Ваш скрипт вообще не срабатывает на Microsoft Windows 7 Professional Service Pack 1 Russian x64

Видео прилагаю - Запись_2023_04_16_22_27_59_557.mp4.zip

Прилагаю логи - текстовые файлы, полученные утилитой Inspect_W7.exe:
1) в трее один раз нажимаю правой кнопкой мышки по значку AdGuard
2) появится меню
3) строки Включить защиту и Отключить защиту на 30 секунд
 

Вложения

  • Запись_2023_04_16_14_18_03_385.mp4.zip
    1.4 МБ · Просмотры: 2
  • 2023-04-16_0001.png
    2023-04-16_0001.png
    81.7 КБ · Просмотры: 3
  • Запись_2023_04_16_22_27_59_557.mp4.zip
    2.3 МБ · Просмотры: 0
  • Включить защиту.txt
    2 КБ · Просмотры: 0
  • Отключить защиту на 30 секунд.txt
    2 КБ · Просмотры: 0
Последнее редактирование:

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI


Здравствуйте.

Приношу Вам мои извинения, проверил, работает Ваш совет

Для меня оставил, наверное, финальный для меня код
Код:
#include <UIAutomate.au3> ; https://autoit-script.ru/threads/uiautomate-avtomatizacija-nestandartnyx-ehlementov-gui.16780/
#include <GuiToolbar.au3>

BlockInput ( 1 )
Sleep ( 1000 )

Global $tray, $search = "AdGuard", $item = "Отключить защиту на 30 секунд"

; $tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow321") ; Win7
$tray = ControlGetHandle("[class:Shell_TrayWnd]", "", "ToolbarWindow323") ; Win10
; If FindClick($search) Then Exit ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)
; If FindClick($search) Then Exit ItemClick("[REGEXPCLASS:WindowsForms10.Window]", $item)
If FindClick($search) Then Exit ItemClick("[REGEXPCLASS:WindowsForms10.Window.808]", $item)

; ControlClick("[class:Shell_TrayWnd]", "", "Button1") ; Win7
ControlClick("[class:Shell_TrayWnd]", "", "Button2") ; Win10
; $tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321") ; Win7 ; Win7 = Win10
$tray = ControlGetHandle("[class:NotifyIconOverflowWindow]", "", "ToolbarWindow321") ; Win10 ; Win10 = Win7
; If FindClick($search) Then ItemClick("[REGEXPCLASS:WindowsForms10.Window.20808]", $item)
; If FindClick($search) Then ItemClick("[REGEXPCLASS:WindowsForms10.Window]", $item)
If FindClick($search) Then ItemClick("[REGEXPCLASS:WindowsForms10.Window.808]", $item)

BlockInput ( 0 )
Sleep ( 1000 )

Func FindClick($text)
  For $i = 0 To _GUICtrlToolbar_ButtonCount($tray) - 1
    If StringInStr(_GUICtrlToolbar_GetButtonText($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)), $text) Then
        _GUICtrlToolbar_ClickIndex($tray, $i, "right")
        ; Sleep(1000)
        ; Sleep(100)
      Return 1
    EndIf
  Next
  Return 0
EndFunc

Func ItemClick($wnd, $item)
  Local $hWnd = WinGetHandle($wnd)
  Local $oMenu = _UIA_GetElementFromHandle($hWnd)
  Local $oItem = _UIA_GetControlTypeElement($oMenu, "UIA_MenuItemControlTypeId", $item)
  If _UIA_ElementGetPropertyValue($oItem, "IsEnabled") Then
    _UIA_ElementDoDefaultAction($oItem)
  Else
    ControlSend($hWnd, "", "", "{esc}")
  EndIf
EndFunc


Я Вас очень прошу, пожалуйста, научите, очень нужно, как воспользоваться Вашим советом


В плане, может быть, прикрепите готовый архив, сборку

Я запущу Вашу сборку, открою мой скрипт и на выхлопе получу файл с припиской "_stripped"

В дальнейшем, если у меня что надумаю, буду править файл с припиской "_stripped"

Спаисбо.
 

InnI

AutoIT Гуру
Сообщения
4,958
Репутация
1,448
Я запущу Вашу сборку
Я пользуюсь полной версией SciTE с официального сайта.

буду править файл с припиской "_stripped"
Приложил "стрипнутый" скрипт, который вы назвали
финальный для меня код
 

Вложения

  • Script_stripped.au3
    50 КБ · Просмотры: 3

SharkyEXE

Новичок
Сообщения
134
Репутация
0

InnI


Здравствуйте

1) Большое Вам спасибо за "стриппед" файл

Попробую его уменьшить, неужели просто там все нужно?

Мол, буду комментировать строки, запускать на выполнение - будет запускаться НЕ ругаясь - так и буду комментировать дальше.
Будет ругань - уберу комментарий

2) У меня к Вам огромная просьба

Я написал здесь, без обид, версия для "проще не придумаешь", кто хочет, может проверить сам, лично у меня НЕ получилось

Я не отрицаю, я мог делать не правильно, и так далее и тому подобное

Я Вас прошу - поделитесь здесь или в личные сообщение Вашей рабочей папкой

Я запущу SciTE из Вашей папки, попробую сам научиться получать "стриппед" версию

Мол, Вы можете, я тоже хочу научиться

Повторюсь, у меня версия для "проще не придумаешь", лично у меня НЕ получилось
 
Верх