Что нового

Скрыть иконку сторонней программы в трее

LoveEl

Новичок
Сообщения
26
Репутация
0
Добрый день. Стоит вопрос, удалить иконку сторонней программы из трея. Воспользовался данным скриптом http://autoit-script.ru/index.php?topic=14126.msg89266#msg89266, закачал include библиотеку, все как положено. Он работает, но частично убирает иконку, т.е. из видимой части трея он ее убирает, а вот в том случае если иконка будет здесь
Bezimyanav_3064053_15799606.png
, он этого не делает.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl [?]
удалить иконку сторонней программы из трея
Попробуйте этот пример: Ответ #3. Только вместо клика сделайте удаление
Код:
; _GUICtrlToolbar_ClickIndex($tray, $i)                                        ; <= убрать
_GUICtrlToolbar_DeleteButton($tray, _GUICtrlToolbar_IndexToCommand($tray, $i)) ; <= добавить
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
все работает, но есть маленький нюанс. После сокрытия иконки, на несколько секунд появляется область скрытых значков. т.е. как по клику на стрелочку "Отображать скрытые значки". Да, и кстати это возникает, если удаляемый значок, изначально помещается в область скрытых значков. Может быть можно это исправить?! Спасибо.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl [?]
После сокрытия иконки, на несколько секунд появляется область скрытых значков
Вообще-то она появляется не после удаления, а перед. Оригинальный пример сделан для клика по иконке. Если вам это окно не нужно, просто удалите/закомментируйте строчку
Код:
ControlClick("[class:Shell_TrayWnd]", "", "Button1")
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
Уже пробовал ). Мало того что иконка не удаляется, плюс ко всему, при перезапуске программы с удаляемой иконкой, она (программа) выдает ошибку can't create taskbar icon в окне, мол не может создать иконку, и она действительно не создается ).
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl [?]
Мало того что иконка не удаляется
А когда область скрытых иконок отображается - проблемы с удалением иконки и с перезапуском программы наблюдаются?
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
В том-то и дело что все выполняется как нужно, причем иконка удаляется (чисто визуально может быть) после открытия (клика) по стрелочке области скрытых значков, и все это при условии, что эта иконка изначально должна расположиться в области скрытых значков, если же она изначально должна оказаться в видимой области значков трея, то скрытая область трея даже не открывается, иконка при этом также скрывается, и на некоторое время остается пустая область ))). В принципе то, что эта область открывается и фиг бы с ней. Тут еще стоит вопрос работы скрипта на различных версиях виндовс, будет ли ваш пример работать в других версиях виндовс (проверяю на 7). Тот пример, что я приводил в первом посте, можно "приучить" к разным версиям виндовс при помощи @OSVersion.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl [?]
все выполняется как нужно
Значит тут два варианта:
1. После загрузки Windows нужно хотя бы один раз вызвать это окно, чтобы создалась панель с кнопками.
2. Нужно периодически открывать эту область для обновления/перестроения значков.
Т.е. для гарантированной работы скрипта её лучше каждый раз открывать.

работать в других версиях виндовс
На Win8 нужно кликать по кнопке с [instance:3]
Код:
ControlClick("[class:Shell_TrayWnd]", "", "Button3")
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
А как насчет windows xp, и более поздних?! Товарищи, неужели это единственный способ по скрытию иконки сторонней программы из тулбара?!
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl [?]
Технология та же. Только элементы там будут другие.

Рано ещё о Windows 10 говорить. К релизу многое может измениться.

способ по скрытию иконки сторонней программы
У правильных программ есть настройка отображения значка в трее ;)
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
InnI [?]
Рано ещё о Windows 10 говорить.
Насчет правильности, согласен, но тут хех, приходится доводить "напильником".. Имел ввиду поздних по отношению к xp. В любом случае спасибо вам за ваши ответы и помощь.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
LoveEl
У меня на Win7 работает такой вариант. На других системах не проверял в связи с их отсутствием.
$hWnd - это дескриптор окна, создавшего иконку. Как правило это главное окно. Получилось убрать иконку у Miranda, AnVir, uTorrent, Диспетчера задач. У Skype иконку убрать не получилось, даже перечислив все невидимые окна.
Код:
Const $NIM_DELETE = 0x02
$hWnd = WinGetHandle("Диспетчер задач")
$NOTIFYICONDATA = DllStructCreate("dword cbSize;hwnd hWnd;uint uID;uint uFlags;uint uCallbackMessage;handle hIcon;wchar szTip[128];" _
    & "dword dwState;dword dwStateMask;wchar szInfo[256];uint uVersion;wchar szInfoTitle[64];dword dwInfoFlags;" _
    & "STRUCT;ulong;ushort;ushort;byte[8];ENDSTRUCT;handle hBalloonIcon")
DllStructSetData($NOTIFYICONDATA, 1, DllStructGetSize($NOTIFYICONDATA))
DllStructSetData($NOTIFYICONDATA, 2, $hWnd)
For $uID = 0 To 0xFF
  DllStructSetData($NOTIFYICONDATA, 3, $uID)
  DllCall("shell32.dll", "bool", "Shell_NotifyIcon", "dword", $NIM_DELETE, "struct*", $NOTIFYICONDATA)
Next
 
Автор
L

LoveEl

Новичок
Сообщения
26
Репутация
0
InnI [?]
У меня на Win7 работает такой вариант
win7, winXp полет нормальный, это самый лучший из предложенных вариантов, и работает побыстрее. Тему, можно считать решенной. Благодарю.
 

k_ok_o_s

Новичок
Сообщения
4
Репутация
0
У меня на Win7 работает такой вариант. На других системах не проверял в связи с их отсутствием.
Помогите, пожалуйста, с оптимальным решением на 10-ку. Нагуглил 3 варианта:
1) Ваш. На 10-ке не рабротает.
2) с помощьью _SysTray_UDF. В последних сообщениях темы "_SysTray UDF" говорят, что instance в коде _SysTray_UDF не поправлен под 10-ку. А в предпоследнем сообщении той темы даётся универсальный код, работающий во всех версиях Windows и на видимых, и на скрытых иконках, но я не понимаю, как его применить.
3) через функции GuiToolBar.au3. Я там поправил Instanse на 3 и заработало на 10-ке, НО весьма нестабильно (то правильно отрабатывает, то не ту иконку скрывает, то вообще не скрывает) и только с не скрытыми иконками.
 
Последнее редактирование:

alexei_bat

Новичок
Сообщения
1
Репутация
0
Стабильно работает у меня на Windows 10 код
Код:
#include <GuiToolbar.au3>

Global $tray, $search = "Google Chrome"

$tray = ControlGetHandle('[Class:Shell_TrayWnd]', '', '[Class:ToolbarWindow32;Instance:3]')

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

Exit

Соответственно на других Windows меняется Instance, например для 7-ки это Instance:1

По материалам:
https://autoit-script.ru/threads/okna-dialogi-zapusk-ili-aktivacija-okna-programmy-iz-treja.12979/
и данной темы а именно https://autoit-script.ru/threads/skryt-ikonku-storonnej-programmy-v-tree.18822/post-113317
 
Последнее редактирование:
Верх