Вопрос про ТРЕЙ

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Вопрос про ТРЕЙ

Сообщение X-BOND » 14.07.2003 (Пн) 14:54

Привет!
Имею программку, которая при запуске прописывает свою иконку в трее. Проблема возникает, когда глючит Explorer и его приходится перезагружать. И значек исчезает из трея. Так вот я хотел бы узнать, какими методами можно перехватить момент перезагрузки TaskBar-а и вновь прописать там свою иконку.

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 14.07.2003 (Пн) 15:28

Сабклассишь форму и перехватываешь сообщение TaskBarCreated.
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 14.07.2003 (Пн) 15:43

А можно пример какой нибудь :wink:

MEMBER
Гугль
Гугль
 
Сообщения: 758
Зарегистрирован: 29.11.2002 (Пт) 12:02
Откуда: 10 этаж

Сообщение MEMBER » 14.07.2003 (Пн) 15:57

Что, лениво разбираться? :)
В форму:
Код: Выделить всё
Public TaskBar
Private Sub Form_Load()
    AddIcon ' Добавляем иконку
    TaskBar = RegisterWindowMessage("TaskbarCreated")
    gWH = Me.hwnd 'дескриптор нашего окна
    OldWndProc = SetWindowLong(gWH, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Shell_NotifyIcon NIM_DELETE, nid
End Sub

В модуль:
Код: Выделить всё
' Сабклассинг
Declare Function SetWindowLong Lib "user32" Alias _
            "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex _
            As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias _
            "CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
            ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam _
            As Long, ByVal lParam As Long) As Long
Declare Function RegisterWindowMessage Lib "user32" _
            Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
Public Const GWL_WNDPROC = -4
Public gWH As Long
Public OldWndProc As Long
   
Public Declare Function Shell_NotifyIcon Lib "shell32" _
            Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _
            pnid As NOTIFYICONDATA) As Boolean

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
End Type

' Эти константы нужны для добавления, обновления
' и удаления иконки в SysTray
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2

' Следующая константа нужна для показа всплывающей подсказки
' когда курсор наводится на иконку в SysTray
Public Const WM_MOUSEMOVE = &H200

' Принимаем значения констант NOTIFYICONDATA
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4

' Следующие константы нужны для проверки нажатий клавиш мышки

' Константы при нажатии левой кнопки мышки
Public Const WM_LBUTTONDBLCLK = &H203
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202

' Константы при нажатии правой кнопки мышки
Public Const WM_RBUTTONDBLCLK = &H206
Public Const WM_RBUTTONDOWN = &H204
Public Const WM_RBUTTONUP = &H205
Public nid As NOTIFYICONDATA

Public Sub AddIcon()
' добавляем иконку от формы в SysTray
    nid.cbSize = Len(nid)
    nid.hwnd = frmMain.hwnd
    nid.uId = vbNull
    nid.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    nid.uCallBackMessage = WM_MOUSEMOVE
    nid.hIcon = frmMain.Icon
    nid.szTip = "Autologin" & vbNullChar
' добавим иконку в SysTray
    Shell_NotifyIcon NIM_ADD, nid
    Shell_NotifyIcon NIM_MODIFY, nid
End Sub
Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal _
                    wParam As Long, ByVal lParam As Long) As Long
    Dim lReturn As Long
    TaskBarcreated = frmMain.TaskBar
   
    'вначале позволим произвести обработку стандартной оконной процедуре процедуре, а затем сами
    lReturn = CallWindowProc(OldWndProc, hwnd, Msg, wParam, lParam)
    Select Case Msg 'проверяем сообщения
        Case TaskBarcreated 'если нужное нам, то выполняем некоторые действия
        AddIcon
    End Select
    WindowProc = lReturn 'вернем значение функции
End Function
Господа! Пользуйтесь www.ya.ru
ЗЫ и www.planetsourcecode.com

X-BOND
Реалист
Реалист
 
Сообщения: 944
Зарегистрирован: 19.08.2002 (Пн) 11:44
Откуда: Ukraine

Сообщение X-BOND » 14.07.2003 (Пн) 16:07

Благодарствую, MEMBER, за приведенный пример :wink:
А вообще ты прав, ленивый я :D. И еще не совсем понимаю, что такое Сабклассинг :roll:.
Щас буду разбираться...

emlen
Новичок
Новичок
Аватара пользователя
 
Сообщения: 26
Зарегистрирован: 04.06.2006 (Вс) 19:36

Re: Вопрос про ТРЕЙ

Сообщение emlen » 02.12.2011 (Пт) 10:33

Большущее спасибо МЕМБЕР за пример, нигде не мог найти, очень и очень благодарен!!!!!

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re:

Сообщение VBTerminator » 02.12.2011 (Пт) 18:48

MEMBER, лучше не Public TaskBar, а Public TaskBar As Long.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Вопрос про ТРЕЙ

Сообщение Хакер » 02.12.2011 (Пт) 19:47

Сразу обоим предупреждение за некрофилию?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 02.12.2011 (Пт) 19:54

А как можно чужие иконки в трей вернуть? Или это невозможно?

tav
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 28.05.2010 (Пт) 6:48

Re: Вопрос про ТРЕЙ

Сообщение tav » 02.12.2011 (Пт) 20:18

Qwertiy писал(а):А как можно чужие иконки в трей вернуть? Или это невозможно?

теоретически, зная какие программы добавили иконки в трей, т.е. придется отлавливать всех кто туда добавляется, и после "попросить" обновить их свои иконки.


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

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

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

    TopList