Страница: 1 |
Страница: 1 |
Вопрос: System Tray
Добавлено: 17.03.06 14:22
Автор вопроса: Fobos
У меня такой вопрос...
Сделать чтобы прога сворачивалась в трей я могу...
И попап меню оформить тоже можно...
Вопрос не об этом )
Проблема следующая:
Если форму с которой порисходят действия растянуть вширь и медленно курсор вести вправо, то открывается попап меню трея... или мсгбокс (смотря как реагирует иконка в трее на движение или щелчок мыши)
Как будто проведена вертикальная невидимая линия на форме, выход за которую воспринимается как щелчок на иконку в трее...
Сколько разных кодов я перепробовал, такая проблема была всегда...
Может это можно как нибудь исправить ?
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #1
Добавлено: 17.03.06 14:29
Сделать чтобы прога сворачивалась в трей я могу...
И попап меню оформить тоже можно...
Вопрос не об этом )
Кто тебя знает.. код выкладывай, это не распространённая проблема.
Номер ответа: 2
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #2
Добавлено: 17.03.06 14:41
код кнопки в трее передаётся через x (нижнее слово lParam), так что иногда случайно совпадает
Номер ответа: 3
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #3
Добавлено: 17.03.06 14:42
ты прячь енту форму, а показывай другую....
Номер ответа: 4
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #4
Добавлено: 17.03.06 14:43
или не делай форму больше определённых размеров...
Номер ответа: 5
Автор ответа:
Fobos
Вопросов: 3
Ответов: 5
Профиль | | #5
Добавлено: 17.03.06 15:17
Случайно заметил этот баг, но он у меня получался всегда...
Просто он не всегда заметен...
У меня главное окошко программы большое, поэтмоу и заметил...
SL, стопудов... так и сделаю )
Че ж я сам не додумался то )))
Номер ответа: 6
Автор ответа:
Fobos
Вопросов: 3
Ответов: 5
Профиль | | #6
Добавлено: 17.03.06 15:41
Со второй формой конечно нет этого косяка, но хотелось бы не обойти ошибку а исправить ее...
Вот собственно код:
В модуле:Option Explicit
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Public Const NIM_ADD = &H0
Public Const NIM_MODIFY = &H1
Public Const NIM_DELETE = &H2
Public Const NIF_MESSAGE = &H1
Public Const NIF_ICON = &H2
Public Const NIF_TIP = &H4
Public Const WM_MOUSEMOVE = &H200
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 HWND_TOPMOST = -1
Public nid As NOTIFYICONDATA
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
В форме:
Private Sub Form_Load()
Me.Show
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Sys As Long
Sys = x / Screen.TwipsPerPixelX
Select Case Sys
Case WM_LBUTTONDBLCLK:
WindowState = vbNormal
Me.Show
Case WM_RBUTTONDOWN:
Me.PopupMenu mnuSystray
End Select
End Sub
Private Sub Form_Resize()
If WindowState = vbMinimized Then
Me.Hide
Me.Refresh
With nid
.cbSize = Len(nid)
.hwnd = Me.hwnd
.uId = vbNull
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uCallBackMessage = WM_MOUSEMOVE
.hIcon = Me.Icon
.szTip = Me.Caption & vbNullChar
End With
Shell_NotifyIcon NIM_ADD, nid
Else
Shell_NotifyIcon NIM_DELETE, nid
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Shell_NotifyIcon NIM_DELETE, nid
End
End Sub
Private Sub mnuexit_Click()
Unload Me
End Sub
Private Sub mnuRestore_Click()
WindowState = vbNormal
Me.Show
End Sub
Номер ответа: 7
Автор ответа:
Fobos
Вопросов: 3
Ответов: 5
Профиль | | #7
Добавлено: 17.03.06 15:47
Тем более если я код буду писать в одной форме и сделаю ее невидимой а сворачивать буду вторую, то ничего происходить не будет...
Я не подумал и сразу согласился с SL
Номер ответа: 8
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #8
Добавлено: 17.03.06 16:19
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Dim Sys As Long
Sys = x / Screen.TwipsPerPixelX
If Not Me.Visible Then
Select Case Sys
Case WM_LBUTTONDBLCLK:
WindowState = vbNormal
Me.Show
Case WM_RBUTTONDOWN:
Me.PopupMenu mnuSystray
End Select
End If
End Sub
Номер ответа: 9
Автор ответа:
SL
ICQ: 277007669
Вопросов: 10
Ответов: 86
Профиль | | #9
Добавлено: 17.03.06 16:22
а про две формы, то всё будет работать - надо правильно сделать)))
Номер ответа: 10
Автор ответа:
Fobos
Вопросов: 3
Ответов: 5
Профиль | | #10
Добавлено: 17.03.06 16:22
Во, другое дело...
Логично было бы это дописать... но ведь главное придумать идею )
Спасибо в общем.. вопрос исчерпан
Номер ответа: 11
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #11
Добавлено: 17.03.06 23:12
2 All: че паритесь???
Пишите хэндл какого-нить picturebox и ловите Private Sub Form_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) соответственно в Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Номер ответа: 12
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #12
Добавлено: 18.03.06 16:13
У тебя пикчер с невидимой гранью находится за гранью формы. На него передаются ивенты от иконки. Щелчок на нем вызывает те же события.
sacred Phoenix, он так и сделал. Так многие ловятся.
Номер ответа: 13
Автор ответа:
Sacred Phoenix
ICQ: 304238252
Вопросов: 52
Ответов: 927
Профиль | | #13
Добавлено: 18.03.06 21:05
Номер ответа: 14
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #14
Добавлено: 20.03.06 10:15
Ну, есть пикчер. Его не видно(BorderStyle=0? BackColor=ButtonFace). А еще он за границей формы. На него передаются события с иконки(MouseDown,Move,Up). Он случайно по нем щелкает-ловятся все равно те же события. Ну или он передает прям на форму-когда она маленькая, щелкнуть негде, а при ресайзе появляется свободное место. Здесь все примеры этим страдают.(AfClock)
Номер ответа: 15
Автор ответа:
Victor
ICQ: 345743490
Вопросов: 42
Ответов: 385
Web-сайт:
Профиль | | #15
Добавлено: 20.03.06 19:27
Прще воспользоваться контролом SysTray от Microsoft. Он у меня нашелся на Disk3 к VS6.0. Там у меня еще сервиспак третий, агент и еще изрядно всякой фигни. Он в исходных кодах, никаких OCX. И мне нравится: просто, удобно, и глюков еще не замечал.