Форма теряет фокус после выхода из трея

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Форма теряет фокус после выхода из трея

Сообщение sergey-911 » 30.01.2007 (Вт) 21:45

Доброго времени суток уважаемые. Есть модальная форма, которая при минимизации сворачивается в трей. Код и пример приведён. После щелчка на икоке в трее форма востанавливается, НО...
1) Если после помещения формы в трей было открыто какое-либо окно, то оно загораживает окно приложения, вышедшего из трея.
2) Чтобы форма среагировала на клик мыши - нужно кликнуть дважды.
В общем окно становится не активно...
Код: Выделить всё

Option Explicit

'V Форма сворачивается в трей******************************************************************************************************************
Private 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 Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4

Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205

Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Dim TrayI As NOTIFYICONDATA
Dim State As Integer    'запоминаем WindowState формы
'A Форма сворачивается в трей******************************************************************************************************************

Private Sub MDIForm_Load()
On Error GoTo Er
   
    frmFirst.Show
    frmFirst.ZOrder
               
Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

Private Sub MDIForm_Resize()
On Error GoTo Er

    'V Форма сворачивается в трей**********************************************************
    If WindowState = 1 Then
        TrayI.hWnd = Picture1.hWnd 'Link the trayicon to this picturebox
        TrayI.uId = 1&
        TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
        TrayI.ucallbackMessage = WM_LBUTTONDOWN
        TrayI.hIcon = Picture1.Picture
        TrayI.szTip = "Форма в трее" & Chr$(0)
        Shell_NotifyIcon NIM_ADD, TrayI
        Me.Hide
    End If
    If WindowState <> 1 Then State = WindowState
    'A Форма сворачивается в трей**********************************************************

Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
On Error GoTo Er

    'V Форма из трея************************************************************************
    Dim Msg As Integer
    Msg = x / Screen.TwipsPerPixelX
    If Msg = WM_LBUTTONUP Or Msg = WM_RBUTTONUP Then 'Click
        'Восстанавливаем форму
        WindowState = State
        Me.Visible = True
        Screen.MousePointer = vbDefault
        'Убираем значёк из трея
        TrayI.cbSize = Len(TrayI)
        TrayI.hWnd = Picture1.hWnd
        TrayI.uId = 1&
        'Delete the icon
        Shell_NotifyIcon NIM_DELETE, TrayI
    End If
    'A Форма из трея************************************************************************

Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

Private Sub MDIForm_QueryUnload(Cancel As Integer, UnloadMode As Integer)
On Error GoTo Er
   
    If UnloadMode = vbFormControlMenu Then
        Cancel = MsgBox("Выйти?", vbQuestion + vbYesNo, "Выход") <> vbYes
    End If
   
Exit Sub
Er:
Screen.MousePointer = vbDefault
MsgBox "Error " & Err.Number & ": " & Err.Description, vbOKOnly + vbCritical, "Error"
End Sub

Прочитал, что это ппроисходит после вызова функции
Код: Выделить всё
Shell_NotifyIcon

Для устранения данной проблемы рекомендовано юзать
Код: Выделить всё
SetForegroundWindow

Пробовал - не помогает.
Вложения
Tray.rar
Пример трея
(12.89 Кб) Скачиваний: 45
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 30.01.2007 (Вт) 21:50

Схожий топик
http://bbs.vbstreets.ru/viewtopic.php?t=29036&highlight=tray+%F2%F0%E5%E9
Но решения проблемы я в нём не нашёл...
С уважением, Сергей.

sergey-911
Постоялец
Постоялец
 
Сообщения: 545
Зарегистрирован: 17.01.2005 (Пн) 19:10

Сообщение sergey-911 » 30.01.2007 (Вт) 23:19

Благодаря поллзователькому контролу из примера GSerg(а) в топике http://bbs.vbstreets.ru/viewtopic.php?t=21904&highlight=tray+%F2%F0%E5%E9 смог добиться работающего результата. Но хотелось бы узнать, как заставить корректно работать пример, расположенный выше?
Вложения
TrayNov.rar
Рабочий пример с пользовательским контролом GSerg(а)
(19.26 Кб) Скачиваний: 45
С уважением, Сергей.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

    TopList