Программирование на 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.
-
X-BOND
-
- Реалист
-
-
- Сообщения: 944
- Зарегистрирован: 19.08.2002 (Пн) 11:44
- Откуда: Ukraine
X-BOND » 14.07.2003 (Пн) 15:43
А можно пример какой нибудь
-
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
-
X-BOND
-
- Реалист
-
-
- Сообщения: 944
- Зарегистрирован: 19.08.2002 (Пн) 11:44
- Откуда: Ukraine
X-BOND » 14.07.2003 (Пн) 16:07
Благодарствую,
MEMBER, за приведенный пример
А вообще ты прав, ленивый я
. И еще не совсем понимаю, что такое Сабклассинг
.
Щас буду разбираться...
-
emlen
-
- Новичок
-
-
- Сообщения: 26
- Зарегистрирован: 04.06.2006 (Вс) 19:36
-
emlen » 02.12.2011 (Пт) 10:33
Большущее спасибо МЕМБЕР за пример, нигде не мог найти, очень и очень благодарен!!!!!
-
VBTerminator
-
- Постоялец
-
-
- Сообщения: 415
- Зарегистрирован: 19.11.2008 (Ср) 20:10
-
VBTerminator » 02.12.2011 (Пт) 18:48
MEMBER, лучше не Public TaskBar, а Public TaskBar As Long.
-
Хакер
-
- Телепат
-
-
- Сообщения: 16478
- Зарегистрирован: 13.11.2005 (Вс) 2:43
- Откуда: Казахстан, Петропавловск
-
Хакер » 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 наук
-
-
- Сообщения: 2753
- Зарегистрирован: 26.06.2011 (Вс) 21:26
Qwertiy » 02.12.2011 (Пт) 19:54
А как можно чужие иконки в трей вернуть? Или это невозможно?
-
tav
-
- Начинающий
-
-
- Сообщения: 17
- Зарегистрирован: 28.05.2010 (Пт) 6:48
tav » 02.12.2011 (Пт) 20:18
Qwertiy писал(а):А как можно чужие иконки в трей вернуть? Или это невозможно?
теоретически, зная какие программы добавили иконки в трей, т.е. придется отлавливать всех кто туда добавляется, и после "попросить" обновить их свои иконки.
Вернуться в Visual Basic 1–6
Кто сейчас на конференции
Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 61