Как узнать есть ли иконка программы в сис трее?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Как узнать есть ли иконка программы в сис трее?

Сообщение Pantalone » 22.11.2008 (Сб) 18:55

Ерунда такая случается иногда с моей прогой, которая грузится через реестр автостартом. При загрузке компа если сразу же набрать логин с паролем то прога грузится, но иконка в трее почему-то не добавляется, хотя прога работает. А если перед логином подождать пока комп слегка пошуршит винтом и уже потом залогиниться, то иконка попадает в трей нормально. Такое впечатление что в момент загрузки из-за активного запуска всяких процессов добавление иконки в трей не срабатывает почему-то. Вот думаю чтобы через небольшие промежутки проверять есть ли иконка в трее и если нет то засандалить туда ее повторно. Но как понять есть там моя иконка или нету?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 22.11.2008 (Сб) 21:22

А почему так принципиально, чтобы твоя прога сверкала в трее?

Williams
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1280
Зарегистрирован: 06.05.2008 (Вт) 18:35
Откуда: System.Reflection.Williams (увидел себя в зеркале :))

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Williams » 22.11.2008 (Сб) 22:00

Может твоя прога стартует прежде проводника?
И вы думаете, что вас оставят в живых после прочтения этого поста?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 22.11.2008 (Сб) 22:47

Для решения этой задачи, нужно использовать Маршалинг - довольно сложная штука.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Alexanbar » 22.11.2008 (Сб) 23:06

За появление иконки в трее отвечает окно класса Shell_Traywnd. В типовом варанте создаётся проводником, если он используется как оболочка. Соответственно, до того момента, как запустится оболочка, ничего посылать значки в трей не должно.

Также программа должна отслеживать пользовательское сообщение "TASKBARCREATED" (регистрируется через RegisterWindowmessage), чтобы обновить значок в трее. Это поможет восстановить значок в трее при перезапуске проводника, а также помочь решению проблемы, заявленной в теме.

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Pantalone » 23.11.2008 (Вс) 4:10

Alexanbar писал(а):За появление иконки в трее отвечает окно класса Shell_Traywnd. В типовом варанте создаётся проводником, если он используется как оболочка. Соответственно, до того момента, как запустится оболочка, ничего посылать значки в трей не должно.

Каким образом определить, что еще до того или уже после?

Alexanbar писал(а):Также программа должна отслеживать пользовательское сообщение "TASKBARCREATED" (регистрируется через RegisterWindowmessage), чтобы обновить значок в трее. Это поможет восстановить значок в трее при перезапуске проводника, а также помочь решению проблемы, заявленной в теме.

Почитаю, спасибо.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Alexanbar » 23.11.2008 (Вс) 10:57

Каким образом определить, что еще до того или уже после?


А каким образом стартует программа? ЕСли из папки Автозагрузка или из веток реестра Run, то после.

Обработка сообщения Taskbarcreated должна помочь решить проблему, а в качестве дополнительного бонуса - обеспечить сохранение своей иконки в трее при падении проводника, хотя такое в w2000-xp происходит редко.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 23.11.2008 (Вс) 23:47

Pantalone
Ты так и не ответил на мой вопрос: почему важно?.. Хочу уточнить - для чего весь этот сыр-бор нужен?

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение iGrok » 24.11.2008 (Пн) 0:34

awl100Alex писал(а):Pantalone
Ты так и не ответил на мой вопрос: почему важно?.. Хочу уточнить - для чего весь этот сыр-бор нужен?

Ну какая разница? Не так уж и мало вариантов, при которых лучше, чтобы прога висела в трее, а не в открытом варианте на столе, или в свёрнутом - в панели..
label:
cli
jmp label

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 24.11.2008 (Пн) 1:14

iGrok
Нет... ну, я, конечно, догадываюсь... но хотелось бы уточнить... :)

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 24.11.2008 (Пн) 1:44

А если говорить серьезно: то можно и сообщения WM_TASKBARCREATED перехватывать и маршалингом пройтись по трею, и еще там чего можно на придумывать. Но не проще ли будет нам в гору не идти, а как-нибудь ее обойти? Например, вот так...
Вложения
SetTrayIcon.rar
Возобновление иконки в трее...
(5.52 Кб) Скачиваний: 113

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение awl100Alex » 24.11.2008 (Пн) 1:45

Попробуйте теперь инициировать разрушение и перезагрузку Explorer’a.
Для этого проделайте следующее...

1) Запустите прогу Project1.exe – через секунду в трее появится иконка.
2) Теперь откройте Диспетчер задач и перейдите на вкладку «Процессы»
3) Удалите процесс «Explorer.exe», утвердительно ответив на предупреждение.
4) После этого на экране останется только Project1 и Диспетчер задач.
5) Теперь перейдите на вкладку «Приложения» и нажмите «Новая задача...»
6) Появится окно запроса – введите «explorer» и запуск...
7) Вся эта процедура приведет к перезапуску Проводника и вы тут же увидите иконку нашей проги в числе первых!

Вот, собственно, что и требовалось доказать... :)
Pantalone
Этот вариант тебе подходит???

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Денис » 24.11.2008 (Пн) 9:04

Погуглите, если не верите: Иконки в трее пропадают при старте компа, если включена служба UPnP и в сети есть хотя бы одно UPnP устройство. Решения этой проблемы в ХР так и не было найдено.
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Alexanbar » 24.11.2008 (Пн) 10:11

Код: Выделить всё
Public Const strTaskbarCtreared = "TaskbarCreated"
Public WM_TASKBARCREATED as long
Public oldWndProc&
....
sub Form_load

WM_TASKBARCREATED = RegisterWindowMessage(strTaskbarCtreared)

....

oldWndProc& = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
end sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
....
SetWindowLong hwnd, GWL_WNDPROC, oldWndProc
....
end sub
'в модуле:
Public Function WndProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
dim NID As NOTIFYICONDATA

Select Case wMsg
    .......
    Case WM_TASKBARCREATED
   
       .....
      Ret = Shell_NotifyIcon(NIM_MODIFY, NID)
End Select
WndProc = CallWindowProc(oldWndProc, hwnd, wMsg, wParam, lParam)
End Function




end sub


SSecurity
Служба безопасности
Аватара пользователя
 
Сообщения: 1283
Зарегистрирован: 19.08.2003 (Вт) 1:11
Откуда: Россия, Мурманск

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение SSecurity » 24.11.2008 (Пн) 12:23

Ну решений много:)

1. Очевидное - посмотреть в трей, если иконка есть ....
2. Просканировать трей на предмет наличия иконки (попиксельно например :) )
3. заюзать иные варианты (см.выше)

С УважениеМ,
Сергей
Программист - это маленький Бог, а все его ошибки - это самостоятельные творения:)
Так задумано:)

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как узнать есть ли иконка программы в сис трее?

Сообщение Twister » 27.11.2008 (Чт) 11:27

Это поможет узнать, есть твоя иконка в трее или нет.
А я все практикую лечение травами...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 67

    TopList