Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Удалить чужой значок из трея.  (Прочитано 36953 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Ципихович Эндрю
Помогающий

ru
Offline Offline

« : 18-06-2011 14:33 » 

Как удалить чужой значок из трея? Известны имя, адрес, хендл программы, добавившей значок в трей
« Последнее редактирование: 21-06-2011 07:23 от Sel » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-06-2011 15:16 » 

нужно знать хендл окна, с которым связан значок, и индекс значка в контексте того окна. Далее вызвать
http://msdn.microsoft.com/en-us/library/bb762159(VS.85).aspx
с флагом NIM_DELETE
Записан

Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #2 : 18-06-2011 15:39 » 

Златоуст, салют, почитаю
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 18-06-2011 15:51 » 

не за что )
Записан

BelowZro
Интересующийся

ru
Offline Offline

« Ответ #4 : 18-06-2011 16:12 » 

нужно знать хендл окна, с которым связан значок, и индекс значка в контексте того окна.
хендл окна вроде можно узнать, используя FindWindowEx и EnumChildWindows. а как узнать "индекс значка в контексте того окна"?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 18-06-2011 16:30 » 

BelowZro, никак Улыбаюсь  Но есть одно "но". Обычно индекс не меняется  - просканировать один раз и потом найденную константу использовать. Также обычно этот индекс равен 0, либо  не больше 10 (вряд ли 10 значков окно выводит). Хотя, ничего не мешает особо извращённому программисту делать случайный индекс ))  А индекс энтот - 4-байтное число

ещё , возможно, пользовали не индекс, а GUID
Цитата
guidItem
Type: GUID

Windows XP and later.

Windows 7 and later: A registered GUID that identifies the icon. This value overrides uID and is the recommended method of identifying the icon. The NIF_GUID flag must be set in the uFlags member.
Windows XP and Windows Vista: Reserved; must be set to 0.

Записан

Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #6 : 18-06-2011 16:34 » 

а как вывести список вех иконок в трее???
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 18-06-2011 16:35 » 

Возможно, есть способ спросить у самого трея, какие настройки у значков, которые там горят. Как достать окно известно:


А вот как спросить у ToolBarWindow32 информацию - я не разбирался )

Добавлено через 32 секунды:
вот, я предвидел вопрос ))

* tray.PNG (3.45 Кб - загружено 2910 раз.)
« Последнее редактирование: 18-06-2011 16:36 от Алексей1153 » Записан

Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #8 : 18-06-2011 16:37 » 

это с реестра??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 18-06-2011 16:37 » 

как достать окно - вот тут этот код есть
https://forum.shelek.ru/index.php/topic,12361.msg163676.html#msg163676

Добавлено через 20 секунд:
это с реестра??
нет, это Spy++
« Последнее редактирование: 18-06-2011 16:38 от Алексей1153 » Записан

Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #10 : 18-06-2011 16:38 » 

понял, спасибо, а програмно на ВБА??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 18-06-2011 16:39 » 

Ципихович Эндрю, если там можно юзать ВИНАПИ - то также. Иначе - не знаю
Записан

BelowZro
Интересующийся

ru
Offline Offline

« Ответ #12 : 18-06-2011 17:39 » 

Цитата
Обычно индекс не меняется  - просканировать один раз и потом найденную константу использовать
как?))) заранее спс
если это случайное число, которое, фактичски ни на что не влияет(иконка одна), нельзя вместа чиста просто поставить *?
Записан
zubr
Гость
« Ответ #13 : 18-06-2011 21:20 » 

Если известен хендл окна от имени которого создается иконка в трее, то достаточно в структуре NOTIFYICONDATA::Wnd указать хендл окна и вызвать Shell_NotifyIcon с флагом NIM_DELETE и этой структурой.
Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #14 : 19-06-2011 14:31 » 

уже давно мучаюсь с этим треем никак не получается...
Цитата
Если известен хендл окна от имени которого создается иконка в трее
вопрос:
1) совпадает ли хендл чужой проги, добавившей значок в трей, и хендл самого значка, добавленного чужой прогой в трей?
 если нет, то
2) совпадают ли хендлы некоторых окон чужой проги, добавившей значок в трей, и хендл самого значка, добавленного чужой прогой в трей?
 если нет, то
3) совпадает ли хендл значка вообще хоть с чем-нибудь и как его узнать?
Цитата
достаточно в структуре NOTIFYICONDATA::Wnd указать хендл окна и вызвать Shell_NotifyIcon с флагом NIM_DELETE и этой структурой
тоже пара заморочек, но с этим потом))
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #15 : 19-06-2011 15:01 » 

BelowZro,
1) нет
2) нет
3) у значка скорее всего нет хендла вообще. Или только хендл битмапа - ведь это просто рисунок, выведенный на окно класса ToolbarWindow32.
Записан

BelowZro
Интересующийся

ru
Offline Offline

« Ответ #16 : 19-06-2011 15:06 » 

мммммммм как тогда вообще удалить чужой значок?(         (чужая прога, добавляющая значок, открывается моей прогой)
Записан
zubr
Гость
« Ответ #17 : 19-06-2011 15:20 » 

Был не прав. Индентификатор иконки все таки нужен. То есть в структуре NOTIFYICONDATA надо указывать и UID если он отличен от 0.
1, 2, 3. У значка нет хендла.
Чтобы определить индентификатор значка, можно попробовать спаем поймать окно трея и поставить на логирование сообщений, затем сделать какое то действие над нужной иконкой, к примеру нажать правую клавишу мыши, в отловленном сообщении расшифровывать параметры. Там в параметрах должен быть индентификатор иконки.
Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #18 : 19-06-2011 15:40 » 

хм... придётся всё сначала... итак: у иконки в трее есть хендл, но, даже зная хендл программы и хедлы окон программы, хендл иконки узнать нельзя. ID значка поставляется вместе с самой прогой и это постоянное число. правильно? а то на разных форумах по разному... на данный момент есть код, кикающий значок по порядковому номеру(на винде ХР под номером 0 - последний добавленный значок, на винде 7 - самый левый значок в трее. вот код, может как-то что-то...
Код:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As Long, _
     ByVal wMsg As Long, _
     ByVal wParam As Long, _
     ByRef lParam As Any) _
    As Long
    Private Const WM_USER = &H400
    Private Const TB_BUTTONCOUNT = (WM_USER + 24)
    Private Const TB_DELETEBUTTON = (WM_USER + 22)

Private Sub Command1_Click()
Dim ret As Long
Dim qwe As Long
    ret = FindWindow("Shell_TrayWnd", "")
    ret = FindWindowEx(ret, 0, "TrayNotifyWnd", vbNullString)
    ret = FindWindowEx(ret, 0, "SysPager", vbNullString)
    ret = FindWindowEx(ret, 0, "ToolbarWindow32", vbNullString)
    qwe = SendMessage(ret, TB_BUTTONCOUNT, 0, 0)
    Text1.Text = qwe 'показывает количество иконок в трее
    Text2.Text = ret
    ret = SendMessage(ret, TB_DELETEBUTTON, 0, 0) 'удаляет нулевой значок
End Sub
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 19-06-2011 15:52 » 

BelowZro, сумбурное представление ))  Положение иконки зависит только от очерёдности добавления в трей, а не от индекса.

Пара (HWND,индекс) - это ключ, идентифицирующий иконку. Поэтому окно может создать несколько иконок
Записан

BelowZro
Интересующийся

ru
Offline Offline

« Ответ #20 : 19-06-2011 16:02 » 

но если hwnd иконки ни с чем не связан и узнать его невозможно, чем узнать ID тоже смутные представления, не знаю, что делать. я думал, что хендл иконки представляет собой хендл дочернего окна проги... эх... прога, с которой работаю - скайп. нуно открыть скайп и удалить его значок из трея...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 19-06-2011 16:14 » 

BelowZro, у иконки нет HWND!!! Глянь на рисунок выше - вся иерархия окон от рабстола до "корзинки" трея показана. Где взять ID - как сказал zubr из Spy++ , либо "вручную" просканировать (если индексы небольшие, то это быстро)

Хотя, глянул я в спае - оттуда выцепить ID иконки нельзя, там только порядковый номер на трее. Который нам ни к чему (смотреть, начиная с щелчка правой кнопкой по иконке)


* tray2.PNG (37.06 Кб - загружено 2899 раз.)
« Последнее редактирование: 19-06-2011 16:16 от Алексей1153++ » Записан

Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #22 : 19-06-2011 16:27 » 

вто же время насколько я понял ему надо открыть скайп и удалить иконку, значет скайп запущен последник и иконка крайняя так??
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #23 : 19-06-2011 16:29 » 

Ципихович Эндрю, не факт, что это будет так. Может там ещё что-то запустится.
Записан

BelowZro
Интересующийся

ru
Offline Offline

« Ответ #24 : 19-06-2011 16:31 » 

вот, что нужно, чтобы добавить иконку в трей
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = hWnd
TrayI.uId = 1&
TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
TrayI.ucallbackMessage = WM_LBUTTONDOWN
TrayI.hIcon = picture
TrayI.szTip = traytip & Chr$(0)
а вот, что нужно, по статье на одном из сайтов, чтобы удалить иконку
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = hWnd
TrayI.uId = 1&
Shell_NotifyIcon NIM_DELETE, TrayI
короче, я совсем запутался...
*ЦЭ, ты абсолютно прав, на ХР я так и делал. но на семёрка 0 означает, что иконка находится слева, а не то, что её добавили последней
Записан
Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #25 : 19-06-2011 16:45 » 

а что это
попробовать воспользоваться функцией Shell_NotifyIcon
не катит??
Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #26 : 19-06-2011 16:52 » 

Цитата
попробовать воспользоваться функцией Shell_NotifyIcon
для этого надо знать hwnd... а что такое хендл значка, существует ли он и как связан с вызвавшей его прогой никто не знает... прям америку открываю
+к проблемам айди(но он вроде не обязательно нужен) и матерые ругательства моего бейсика на эту функцию. p/s я предполагаю, что хендл значка - это хендл самой проги, добавившей значок, но могу ошибаться. скайп, я думаю, есть у всех, только как на нём проверить... ща скину прогу, закидывающую иконку в трей, чтоб на ней тренироваться...

Добавлено через 57 секунд:
воть..

* Form1.exe (20 Кб - загружено 779 раз.)
« Последнее редактирование: 19-06-2011 16:53 от BelowZro » Записан
Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #27 : 19-06-2011 17:00 » 

у меня в ХР работает, а в текстбоксе что должно быть??

Добавлено через 3 минуты и 36 секунд:
иконку ставлю в форме ВБ 6 - пытаюсь ставить её - файл *.ico получаю - Недопустимое изображение
Не понялНе понял??
« Последнее редактирование: 19-06-2011 17:03 от Ципихович Эндрю » Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #28 : 19-06-2011 17:17 » 

зачем ставишь иконку?) может размер не подходит, для иконки нужна картинки нужной ширины высоты
Записан
Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #29 : 19-06-2011 17:25 » 

а что юзер должен париться, я так понял лишь бы разрешение было то и всё, разве не так??
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines