Иконка в Tray - глюк

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

Иконка в Tray - глюк

Сообщение Scuder » 22.09.2004 (Ср) 11:23

Очень надеюсь, что у кого-нибудь найдётся кусочек времени, чтобы создать новый проект и протестировать этот код. При нажатии на кнопку "свернуть" я делаю frm.hide, при MouseDown в трее - frm.show. В компиляторе всё работает номально, но в EXE'шнике, когда форма становится видна, на неё не попадает фокус. Что только не делал - ничего не помогает. Т.е. полоска синяя, визуально фокус на форме, но на первый клик мыши ни один элемент не реагирует. При первом клике форма только получает фокус. И только после этого с ней можно работать.. Замучило это уже. :-(

Код модуля:
Код: Выделить всё
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_LBUTTONDBLCLK = &H203

Type NOTIFYICONDATA
    cbSize           As Long
    hWnd             As Long
    uID              As Long
    uFlags           As Long
    uCallbackMessage As Long
    hIcon            As Long
    szTip            As String * 64
End Type
Private NID As NOTIFYICONDATA

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _
"Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) _
As Long

'Добавление иконки в Tray
Public Sub AddTrayIcon(IDhWnd As Long, Icon As Long, Text As String)
    NID.szTip = Left$(Text, 63) & Chr$(0)
    NID.uFlags = NIF_TIP + NIF_MESSAGE + NIF_ICON
    NID.uID = IDhWnd
    NID.cbSize = Len(NID)
    NID.hWnd = IDhWnd
    NID.uCallbackMessage = WM_RBUTTONDOWN
    NID.hIcon = Icon
    Res& = Shell_NotifyIcon(NIM_ADD, NID)
End Sub

'Удаление иконки из Tray
Public Sub DeleteTrayIcon()
    NID.cbSize = Len(NID)
    Res& = Shell_NotifyIcon(NIM_DELETE, NID)
End Sub

'Изменение иконки и ToolTip в Tray
Public Sub ItemModify(Icon As Long, Text As String)
    NID.uFlags = NIF_TIP + NIF_ICON
    NID.cbSize = Len(NID)
    NID.szTip = Left$(Text, 63) & Chr$(0)
    NID.hIcon = Icon
    Res& = Shell_NotifyIcon(NIM_MODIFY, NID)
End Sub


В форме:
Код: Выделить всё
'Добавление иконки
AddTrayIcon Me.hWnd, TrayPic, "xxx"

'Изменение иконки
ItemModify TrayPic, "xxx"

'Удаление иконки
DeleteTrayIcon

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Y = 0 And X = 513 * Screen.TwipsPerPixelX Then
   
    Me.Show
    Me.SetFocus
    WindowState = 0
   
    'AppActivate "xxx", 1
End If

End Sub


TrayPic - пикчербокс с иконкой.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 14:45

Ну люди-и-и!! Ну посмотрите код. Реальная головоломка.. Help!!

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 22.09.2004 (Ср) 15:13

Не знаю в чём проблемма :?:
Проверил, у меня всё работает. Вот только после того как я "засунул" форму в трей сделал Me.Hide

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 15:18

Как работает?? Оно не может работать. :-)
Я добавляю иконку в трэй в форм_лоад. Потом при форм_ресайз я делаю hide. Затем кликаю по иконке в трее (mousedown) и делаю show. Фокус не передаётся. Касается исключительно скомпилированного EXE'шника.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 22.09.2004 (Ср) 15:22

Теперь понятно...
Поставь какой-то флажёк в ресайзе, иначе ничего не получется.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 15:23

В смысле? У меня это так выглядит:
Код: Выделить всё
If Me.Left < 0 Then
    Me.Hide
Else
    Me.Show
    Me.SetFocus
End If

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 22.09.2004 (Ср) 15:37

У тебя процедура ресайз вызывается когда сворачиваешь и РАЗВАРАЧИВАЕШЬ форму. Понял?
Т.е. когда ты хочешь показать её, она у тебя прячится

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 15:55

Да блин. Ничего там не прячется! Посмотри на Me.Left. У меня всё показывается, просто фокуса нет.. Ты говоришь, у тебя нормально работает? Можешь код кинуть? :?

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 22.09.2004 (Ср) 16:02

Вот так попробуй:
Код: Выделить всё
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Y = 0 And X = 513 * Screen.TwipsPerPixelX Then
   
    Me.WindowState = 0
    Me.Show
End If

End Sub

Private Sub Form_Resize()
    If Me.WindowState = 1 Then
        AddTrayIcon Me.hWnd, TrayPic, "xxx"
        Me.Hide
    Else
        Me.Show
        DeleteTrayIcon
    End If
End Sub

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 16:13

Ну так ты попробуй скомпилить EXE'шник!!
но в EXE'шнике, когда форма становится видна, на неё не попадает фокус.


Сделай кнопку на форме в неё msgbox и запусти. После возврата из трэя попробуй эту кнопку нажать.. Получится со второго раза.. :-(

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 22.09.2004 (Ср) 16:36

М-да, у меня тоже

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 17:08

Парни, дайте код целиком, чтоб попробовать, а то ломает собирать его из обрывков по всему топику...
Изображение

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 22.09.2004 (Ср) 17:12

Да вот он..
На форму PictureBox (TrayPic), Command1.
Код: Выделить всё
Private Sub Command1_Click()

MsgBox "!"

End Sub

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Y = 0 And X = 513 * Screen.TwipsPerPixelX Then
    Me.WindowState = 0
    Me.Show
End If

End Sub

Private Sub Form_Resize()
    If Me.WindowState = 1 Then
        AddTrayIcon Me.hWnd, TrayPic, "xxx"
        Me.Hide
    Else
        Me.Show
        DeleteTrayIcon
    End If
End Sub


А это в модуль:
Код: Выделить всё
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_LBUTTONDBLCLK = &H203

Type NOTIFYICONDATA
    cbSize           As Long
    hWnd             As Long
    uID              As Long
    uFlags           As Long
    uCallbackMessage As Long
    hIcon            As Long
    szTip            As String * 64
End Type
Private NID As NOTIFYICONDATA

Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _
"Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) _
As Long

'Добавление иконки в Tray
Public Sub AddTrayIcon(IDhWnd As Long, Icon As Long, Text As String)
    NID.szTip = Left$(Text, 63) & Chr$(0)
    NID.uFlags = NIF_TIP + NIF_MESSAGE + NIF_ICON
    NID.uID = IDhWnd
    NID.cbSize = Len(NID)
    NID.hWnd = IDhWnd
    NID.uCallbackMessage = WM_RBUTTONDOWN
    NID.hIcon = Icon
    Res& = Shell_NotifyIcon(NIM_ADD, NID)
End Sub

'Удаление иконки из Tray
Public Sub DeleteTrayIcon()
    NID.cbSize = Len(NID)
    Res& = Shell_NotifyIcon(NIM_DELETE, NID)
End Sub

'Изменение иконки и ToolTip в Tray
Public Sub ItemModify(Icon As Long, Text As String)
    NID.uFlags = NIF_TIP + NIF_ICON
    NID.cbSize = Len(NID)
    NID.szTip = Left$(Text, 63) & Chr$(0)
    NID.hIcon = Icon
    Res& = Shell_NotifyIcon(NIM_MODIFY, NID)
End Sub

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:05

Вот тут:
Код: Выделить всё
Private Sub Form_Resize()
    If Me.WindowState = 1 Then
        AddTrayIcon Me.hWnd, TrayPic, "xxx"
        Me.Hide
    Else
       
'Me.Show закомментируй писатель мля
        DeleteTrayIcon
    End If
End Sub
Если руки кривые, то не надо ругать разработчиков.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:06

Кстати, маленький хинт: при первом клике на кнопку после восстановления окна происходит Form_MouseDown
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:07

XPraptor писал(а):Вот тут:
Код: Выделить всё
Private Sub Form_Resize()
    If Me.WindowState = 1 Then
        AddTrayIcon Me.hWnd, TrayPic, "xxx"
        Me.Hide
    Else
       
'Me.Show закомментируй писатель мля
        DeleteTrayIcon
    End If
End Sub

Не работает - я начал с того, что его закомментировал :-)
Изображение

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:10

Не зняю что у тебя не работет, у меня все ок, проблемма была в том что ты два раза вызываешь метод Show для уже показанной формы, с закомментированной строкой форма показывается, фокус уже стоит на кнопке (у нее индекс 0) и при клике мышой вылазит msgbox.
Если руки кривые, то не надо ругать разработчиков.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:10

Ещё один хинт: если подключить к форме Spy++, то кнопка кликается нормально.
Прямо квантовая механика: тот факт, что мы наблюдаем на формой, меняет её поведение :-)
Изображение

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:12

Да, забыл сказать, что мне пришлось во всех функциях иконок объявить переменную res& у меня Explicit стоит по умолчанию, может дело в этом потому как у меня все работает.
Если руки кривые, то не надо ругать разработчиков.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:12

XPraptor писал(а):Не зняю что у тебя не работет, у меня все ок, проблемма была в том что ты два раза вызываешь метод Show для уже показанной формы, с закомментированной строкой форма показывается, фокус уже стоит на кнопке (у нее индекс 0) и при клике мышой вылазит msgbox.

Ты под отладчиком проверял, или скомпилированный файл?
В отладчике-то всё в порядке, глюк вылазит только в скомпилированном файле.

А второй показ формы совершенно никак ей не вредит.
Изображение

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:16

Млин, у меня все работает, я уже и Explicit отключил и объявление переменных убрал, всеравно работет с закомментированной строкой без нее даже в отладчике не работает.
Если руки кривые, то не надо ругать разработчиков.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:22

А у меня - нет, даже с Explicit.
И в отладчике работает что с .Show, что без .Show
У тебя какой-то другой VB, что ли?
Изображение

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:23

Опля! Все понял, просто я быстрый олень и машина у меня быстрая:))
Нельзя в событие давна этот код пихать, потому как форма отображается и фркусится при этом а когда отпускаешь мышу MouseUp то фокус тут же переходит в то место где мыша.
Я просто быстро кликал и на форму мышь перемещал, поэтому и работало, а подошел планомерно и да - есть глюк!
Если руки кривые, то не надо ругать разработчиков.

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 22.09.2004 (Ср) 18:25

Вобще то по уму не добавляется так икона в трэй, нужно обрабатывать событие MouseMove и сообщение мыши ловить АПИ-шками, тогда и не будет этого гемора.
Если руки кривые, то не надо ругать разработчиков.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 18:32

XPraptor писал(а):Нельзя в событие давна этот код пихать, потому как форма отображается и фркусится при этом а когда отпускаешь мышу MouseUp то фокус тут же переходит в то место где мыша.
Я просто быстро кликал и на форму мышь перемещал, поэтому и работало, а подошел планомерно и да - есть глюк!

Нифига Form_MouseUp не происходит когда на иконке кликается, неправда!
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 22.09.2004 (Ср) 19:31

Если в shellnotify было указано form.hwnd и wm_lbuttonup, то ещё как происходит :)
Я, кстати, всегда юзаю wm_lbuttonup...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.09.2004 (Ср) 21:35

GSerg писал(а):Если в shellnotify было указано form.hwnd и wm_lbuttonup, то ещё как происходит :)
Я, кстати, всегда юзаю wm_lbuttonup...

правильно, надо там WM_DESTROY указывать...
Изображение

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 23.09.2004 (Чт) 9:23

Блина. чего страдаем то? Простят меня модераторы за длинный код, но вот нормальный код добавления иконы и обработки событий мыши в MouseMove:

Код: Выделить всё
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_MOUSEMOVE = &H200

'Only Win2000
''''''''''''''''''''''''''''''
Public Const NIF_STATE = &H8
'Windows 2000: Компоненты данных dwState и dwStateMask.
Public Const NIF_INFO = &H10
'Windows 2000: Использование стиля воздушного шара вместо обычной всплывающей подсказки.
'Компоненты данных szInfo, szTimeOut, szInfoTitle и dwInfoFlags используются.

    'dwState
'Windows 2000: Комбинация следующих флажков, определяющих состояние значка.
'Каждый флажок - независимый переключатель.
Public Const NIS_HIDDEN = &H1
'Значок скрыт.
Public Const NIS_SHAREDICON = &H2
'Значок разделен.

    'dwStateMask
'Windows 2000: Комбинация вышеупомянутых флажков, которая определяет флажки из dwState для модификаций.
   
    'szInfo
'Windows 2000: Строка с нулевым символом в конце, используемая для стиля воздушного
'шара в подсказке.
   
    'uTimeoutOrVersion
'Windows 2000: Значение времени ожидания, в миллисекундах, для показа подсказки в
'стиле воздушного шара.
'Или, если Shell_NotifyIcon будет вызвано с флагом
'NIM_VERSION
'то вместо этого
'будет определяться, использовать ли поведение Windows 2000 или Windows 95.
'По умолчанию, Windows 2000 будет использовать различные сообщения в некоторых
'случаях, чтобы связаться с окном обладания. Для совместимости, Вы должны использовать
'старое поведение. Это - один из следующих флажков:
'0 - Используйте поведение Windows 95.
Public Const NOTIFYICON_VERSION = &H1 'Используйте поведение Windows 2000.
Public Const NIM_SETFOCUS = &H4
Public Const NIM_SETVERSION = &H8
Public Const NIM_VERSION = &H10
    'szInfoTitle
'Строка с нулевым символом в конце, чтобы использовать как заголовок подсказки в
'стиле воздушного шара. Это будет появляться в жирном начертании текста.
   
    'dwInfoFlags
'Если желательно, один из следующих флажков, определяющих значок, отображаемый слева
'от подсказки в стиле воздушного шара. Установите в 0, чтобы не использовать значок.
Public Const NIIF_WARNING = &H30
'Значок предупреждения.
Public Const NIIF_ERROR = &H10
'Значок ошибки.
Public Const NIIF_INFO = &H40
'Значок информации.
''''''''''''''''''''''''''''''

Public Type NOTIFYICONDATA
    cbSize As Long
    hWnd As Long
    uID As Long
    uFlags As Long
    uCallbackMessage As Long
    hIcon As Long
    szTip As String * 64 'В Win2000 можно String * 128
    'Only Win2000
    dwState As Long
    dwStateMask As Long
    szInfo As String * 256
    uTimeoutOrVersion As Long
    szInfoTitle As String * 64
    dwInfoFlags As Long
End Type

Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Public t_ico As NOTIFYICONDATA

'Добавляем иконку в трэй
'frmICO-Форма которой будет посылаться сообщение
'icoIcon-Любая иконка правильного формата (обычно иконка главной формы)
'strBullon - Текст всплывающей подсказки
'blHideForm- если True то приложение будет скрыто иначе отобразится главная форма
Public Sub Add_Ico_Tray(frmICO As Form, icoIcon As Long, strBullon As String, Optional blHideForm As Boolean = True)
    t_ico.cbSize = Len(t_ico)
    t_ico.hWnd = frmICO.hWnd
    t_ico.uID = 1&
        'устанавливаем флаги
    t_ico.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    ''''''''''''''''''''''''''
        'Только для Win2000
    't_ico.uFlags = NIF_ICON Or NIF_STATE Or NIF_INFO Or NIF_TIP Or NIF_MESSAGE
    ''''''''''''''''''''''''''
        'какое событие мыши посылать форме для обработки (Form_MouseMove)
    t_ico.uCallbackMessage = WM_MOUSEMOVE
        'иконка для программы
    t_ico.hIcon = icoIcon
        'всплыващая подсказка
    t_ico.szTip = Left$(strBullon, 63) & Chr$(0)
    Shell_NotifyIcon NIM_ADD, t_ico
    ''''''''''''''''''''''''''''''''''
        'Только для Win2000
    't_ico.dwState = NIS_SHAREDICON 'NIS_HIDDEN
    't_ico.dwStateMask = NIS_SHAREDICON 'NIS_HIDDEN
    't_ico.szInfo = "This Test Bullon Text in Windows 2000 Operation System" & Chr$(0)
    't_ico.szInfo = Left$(strBullon, 255) & Chr$(0)
    't_ico.uTimeoutOrVersion = 5000 'NOTIFYICON_VERSION
    't_ico.szInfoTitle = "WIN2000 Bullon" & Chr$(0)
    't_ico.dwInfoFlags = 0 'NIIF_WARNING
    'Shell_NotifyIcon NIM_ADD, t_ico
    'Shell_NotifyIcon NIM_VERSION, t_ico
    'Shell_NotifyIcon NIM_SETFOCUS, t_ico
    ''''''''''''''''''''''''''''''''''''''''
        'Отобразить или скрыть приложение
    If blHideForm = True Then
        frmICO.Hide
        App.TaskVisible = False
    Else
        App.TaskVisible = True
        frmICO.Show
    End If
End Sub

'Изменение иконки и всплывающей подсказки
'icoIcon-Новая или старая иконка, strBullon -новый текст всплывающей подсказки
Public Sub ItemModify(icoIcon As Long, strBullon As String)
    t_ico.uFlags = NIF_TIP Or NIF_ICON
    t_ico.cbSize = Len(t_ico)
    t_ico.szTip = Left$(strBullon, 63) & Chr$(0)
    t_ico.hIcon = icoIcon
    Shell_NotifyIcon NIM_MODIFY, t_ico
End Sub

'Удаляем иконку из трэя frmICO - форма чья иконка удаляется
Public Sub Delete_Icon(frmICO As Form)
    t_ico.cbSize = Len(t_ico)
    t_ico.hWnd = frmICO.hWnd
    t_ico.uID = 1&
    Shell_NotifyIcon NIM_DELETE, t_ico
End Sub

'Обработка кликов на иконке
'Х- координата Х из процедуры формы MouseMove
'frmICO- форма которой принадлежит всплывающее меню
'mnuName- меню которое отобразить
'Процедура вызывается из процедуры формы 'Form_MouseMove'
'Можно так же дописать любой код для других событий мыши в SelectCase
Public Sub ICO_Mouse_Events(X As Single, frmICO As Form, mnuName As Menu)
Static rec As Boolean, msg As Long
    msg = X / Screen.TwipsPerPixelX
    If rec = False Then
        rec = True
        Select Case msg
            Case WM_LBUTTONDBLCLK:
            Case WM_LBUTTONDOWN:
            Case WM_LBUTTONUP:
                'При отпускании левой кнопки мыши отображаем форму
                frmICO.Show
            Case WM_RBUTTONDBLCLK:
            Case WM_RBUTTONDOWN:
            Case WM_RBUTTONUP:
                'При отпускании правой кнопки мыши Отображаем всплывающее меню
                frmICO.PopupMenu mnuName
        End Select
        rec = False
    End If
End Sub


Юзать нужно так:
Код: Выделить всё
'Загружаем в трэй иконку формы frmMain и скрываем приложение
Public Sub Load_Ico()
    Call Add_Ico_Tray(frmMain, frmMain.Icon, "TestPRJ Bullon Text!", True)
End Sub

'При клике правой кнопкой мыши отображаем как всплывающее меню формы mnuTrayIconPopup
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call ICO_Mouse_Events(X, frmMain, mnuTrayIconPopup)
End Sub

'При выходе из программы удаляем иконку из трэя:
Call Delete_Icon(frmMain)
Если руки кривые, то не надо ругать разработчиков.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 23.09.2004 (Чт) 11:08

Код: Выделить всё
'При клике правой кнопкой мыши отображаем как всплывающее меню формы mnuTrayIconPopup
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Call ICO_Mouse_Events(X, frmMain, mnuTrayIconPopup)
End Sub


А на левый клик реакции нет. Форма не возвращается из трэя.

XPraptor
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 115
Зарегистрирован: 02.12.2003 (Вт) 18:13
Откуда: Minsk

Сообщение XPraptor » 23.09.2004 (Чт) 12:01

А ты проверь размеры формы, может у тебя она минимизирована или еще что?
Если руки кривые, то не надо ругать разработчиков.

След.

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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 3

    TopList