Ципихович Эндрю
Помогающий
Offline
|
|
« : 18-06-2011 14:33 » |
|
Как удалить чужой значок из трея? Известны имя, адрес, хендл программы, добавившей значок в трей
|
|
« Последнее редактирование: 21-06-2011 07:23 от Sel »
|
Записан
|
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #2 : 18-06-2011 15:39 » |
|
Златоуст, салют, почитаю
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #3 : 18-06-2011 15:51 » |
|
не за что )
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #4 : 18-06-2011 16:12 » |
|
нужно знать хендл окна, с которым связан значок, и индекс значка в контексте того окна.
хендл окна вроде можно узнать, используя FindWindowEx и EnumChildWindows. а как узнать "индекс значка в контексте того окна"?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 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.
|
|
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #6 : 18-06-2011 16:34 » |
|
а как вывести список вех иконок в трее???
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #7 : 18-06-2011 16:35 » |
|
Возможно, есть способ спросить у самого трея, какие настройки у значков, которые там горят. Как достать окно известно: А вот как спросить у ToolBarWindow32 информацию - я не разбирался ) Добавлено через 32 секунды:вот, я предвидел вопрос ))
|
tray.PNG (3.45 Кб - загружено 3015 раз.)
|
« Последнее редактирование: 18-06-2011 16:36 от Алексей1153 »
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #8 : 18-06-2011 16:37 » |
|
это с реестра??
|
|
|
Записан
|
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #10 : 18-06-2011 16:38 » |
|
понял, спасибо, а програмно на ВБА??
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #11 : 18-06-2011 16:39 » |
|
Ципихович Эндрю, если там можно юзать ВИНАПИ - то также. Иначе - не знаю
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #12 : 18-06-2011 17:39 » |
|
Обычно индекс не меняется - просканировать один раз и потом найденную константу использовать как?))) заранее спс если это случайное число, которое, фактичски ни на что не влияет(иконка одна), нельзя вместа чиста просто поставить *?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #13 : 18-06-2011 21:20 » |
|
Если известен хендл окна от имени которого создается иконка в трее, то достаточно в структуре NOTIFYICONDATA::Wnd указать хендл окна и вызвать Shell_NotifyIcon с флагом NIM_DELETE и этой структурой.
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #14 : 19-06-2011 14:31 » |
|
уже давно мучаюсь с этим треем никак не получается... Если известен хендл окна от имени которого создается иконка в трее вопрос: 1) совпадает ли хендл чужой проги, добавившей значок в трей, и хендл самого значка, добавленного чужой прогой в трей? если нет, то 2) совпадают ли хендлы некоторых окон чужой проги, добавившей значок в трей, и хендл самого значка, добавленного чужой прогой в трей? если нет, то 3) совпадает ли хендл значка вообще хоть с чем-нибудь и как его узнать? достаточно в структуре NOTIFYICONDATA::Wnd указать хендл окна и вызвать Shell_NotifyIcon с флагом NIM_DELETE и этой структурой тоже пара заморочек, но с этим потом))
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #15 : 19-06-2011 15:01 » |
|
BelowZro, 1) нет 2) нет 3) у значка скорее всего нет хендла вообще. Или только хендл битмапа - ведь это просто рисунок, выведенный на окно класса ToolbarWindow32.
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #16 : 19-06-2011 15:06 » |
|
мммммммм как тогда вообще удалить чужой значок?( (чужая прога, добавляющая значок, открывается моей прогой)
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #17 : 19-06-2011 15:20 » |
|
Был не прав. Индентификатор иконки все таки нужен. То есть в структуре NOTIFYICONDATA надо указывать и UID если он отличен от 0. 1, 2, 3. У значка нет хендла. Чтобы определить индентификатор значка, можно попробовать спаем поймать окно трея и поставить на логирование сообщений, затем сделать какое то действие над нужной иконкой, к примеру нажать правую клавишу мыши, в отловленном сообщении расшифровывать параметры. Там в параметрах должен быть индентификатор иконки.
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
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
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #19 : 19-06-2011 15:52 » |
|
BelowZro, сумбурное представление )) Положение иконки зависит только от очерёдности добавления в трей, а не от индекса.
Пара (HWND,индекс) - это ключ, идентифицирующий иконку. Поэтому окно может создать несколько иконок
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #20 : 19-06-2011 16:02 » |
|
но если hwnd иконки ни с чем не связан и узнать его невозможно, чем узнать ID тоже смутные представления, не знаю, что делать. я думал, что хендл иконки представляет собой хендл дочернего окна проги... эх... прога, с которой работаю - скайп. нуно открыть скайп и удалить его значок из трея...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #21 : 19-06-2011 16:14 » |
|
BelowZro, у иконки нет HWND!!! Глянь на рисунок выше - вся иерархия окон от рабстола до "корзинки" трея показана. Где взять ID - как сказал zubr из Spy++ , либо "вручную" просканировать (если индексы небольшие, то это быстро) Хотя, глянул я в спае - оттуда выцепить ID иконки нельзя, там только порядковый номер на трее. Который нам ни к чему (смотреть, начиная с щелчка правой кнопкой по иконке)
|
|
« Последнее редактирование: 19-06-2011 16:16 от Алексей1153++ »
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #22 : 19-06-2011 16:27 » |
|
вто же время насколько я понял ему надо открыть скайп и удалить иконку, значет скайп запущен последник и иконка крайняя так??
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Online
Сообщений: 13
|
|
« Ответ #23 : 19-06-2011 16:29 » |
|
Ципихович Эндрю, не факт, что это будет так. Может там ещё что-то запустится.
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
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 означает, что иконка находится слева, а не то, что её добавили последней
|
|
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #25 : 19-06-2011 16:45 » |
|
а что это попробовать воспользоваться функцией Shell_NotifyIcon не катит??
|
|
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #26 : 19-06-2011 16:52 » |
|
попробовать воспользоваться функцией Shell_NotifyIcon для этого надо знать hwnd... а что такое хендл значка, существует ли он и как связан с вызвавшей его прогой никто не знает... прям америку открываю +к проблемам айди(но он вроде не обязательно нужен) и матерые ругательства моего бейсика на эту функцию. p/s я предполагаю, что хендл значка - это хендл самой проги, добавившей значок, но могу ошибаться. скайп, я думаю, есть у всех, только как на нём проверить... ща скину прогу, закидывающую иконку в трей, чтоб на ней тренироваться... Добавлено через 57 секунд:воть..
|
|
« Последнее редактирование: 19-06-2011 16:53 от BelowZro »
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #27 : 19-06-2011 17:00 » |
|
у меня в ХР работает, а в текстбоксе что должно быть?? Добавлено через 3 минуты и 36 секунд:иконку ставлю в форме ВБ 6 - пытаюсь ставить её - файл *.ico получаю - Недопустимое изображение ??
|
|
« Последнее редактирование: 19-06-2011 17:03 от Ципихович Эндрю »
|
Записан
|
|
|
|
BelowZro
Интересующийся
Offline
|
|
« Ответ #28 : 19-06-2011 17:17 » |
|
зачем ставишь иконку?) может размер не подходит, для иконки нужна картинки нужной ширины высоты
|
|
|
Записан
|
|
|
|
Ципихович Эндрю
Помогающий
Offline
|
|
« Ответ #29 : 19-06-2011 17:25 » |
|
а что юзер должен париться, я так понял лишь бы разрешение было то и всё, разве не так??
|
|
|
Записан
|
|
|
|
|