Что нового

Не получается скрыть иконку сторонней программы в трее

Guarut

Новичок
Сообщения
8
Репутация
0
Всем привет!
Нужно скрыть иконку сторонней программы в трее, но те решения, которые я нашёл, или не подходят или работают некорректно .
К примеру:
Код:
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

В этом примере необходимо имя окна, но окна у приложения нет.
Был ещё пример, но если значок скрыт в "окошко" , то он не скрывается.
Строго не судите, я новичок и многого не знаю.
Заранее спасибо!
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Guarut [?]
В этом примере необходимо имя окна, но окна у приложения нет.
Должно быть (возможно скрыто). Окно нужно для обработки событий от иконки в трее.
 

Skif_off

Знающий
Сообщения
173
Репутация
12
Guarut
Для поиска окна и получения его дескриптора можно воспользоваться функцией _Process2Win().
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
А средствами Windows разве не получается?
 
Автор
G

Guarut

Новичок
Сообщения
8
Репутация
0
Функция _Process2Win() при поиске заголовка окна по процессу выдаёт: -1. ( С другими процессами всё нормально. )
Значит окна нет?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Guarut сказал(а):
Значит окна нет?
Значит окно невидимое. А если проще, то у любого приложения есть как минимум одно окно. Если это консольная программа, то, соответственно, окно консоли. Далее, тот пример, что в первом сообщении предназначен для собственного приложения, а вместо "Имя окна" там должно стоять AutoItWinGetTitle(). Ну и вы не ответили на мой вопрос. Разве стандартные средства Windows не скрывают иконку?
 
Автор
G

Guarut

Новичок
Сообщения
8
Репутация
0
Удалить полностью значок по средствам Windows нельзя, из программы тоже. (Написана энтузиастом фиг знает когда, представляет особую службу. )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Guarut сказал(а):
Функция _Process2Win() при поиске заголовка окна по процессу выдаёт: -1. ( С другими процессами всё нормально. )
Значит окна нет?
Используйте эту функцию:

Код:
Func _Process2Win($pid)
	If IsString($pid) Then $pid = ProcessExists($pid)
	If $pid = 0 Then Return -1
	$list = WinList()
	For $i = 1 To $list[0][0]
		If $list[$i][0] <> "" Then
			$wpid = WinGetProcess($list[$i][0])
			If $wpid = $pid Then Return $list[$i][0]
		EndIf
	Next
	Return -1
EndFunc   ;==>_Process2Win



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

Guarut сказал(а):
У меня как - раз таки сервис.
Попробуйте открыть файл программы в любом редакторе ресурсов и удалите соответствующую иконку(и).
 
Автор
G

Guarut

Новичок
Сообщения
8
Репутация
0
Теперь заголовок выдало, но не скрывается, как например Skype.
Удалил всё ресурсы, содержащие изображения - всё равно иконка есть.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Guarut
не скрывается, как например Skype
Для Skype работает пример из той же темы: Ответ #1. Но при таком удалении возможны другие заморочки (читайте всю тему).
Пример был сделан для Win7. На Win8 у кнопки другой индекс
Код:
ControlClick("[class:Shell_TrayWnd]", "", "Button3")
 
Автор
G

Guarut

Новичок
Сообщения
8
Репутация
0
Windows 10, Скрипт как для 7 так и для 8 не работает.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Guarut
Код:
#include <GuiToolbar.au3>

$search = "OneDrive: вход не выполнен" ; текст всплывающей подсказки иконки

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

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

Func FindDel($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
 
Автор
G

Guarut

Новичок
Сообщения
8
Репутация
0
А что делать если текст каждый раз меняется?
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Guarut
если текст каждый раз меняется
В связи с наличием StringInStr() можно использовать часть текста - для приведённого примера достаточно "OneDrive:".
Если текст меняется полностью, то добавьте дополнительные условия через OR.
 
Верх