Приложение VB 6.0 в системном трее не закрывается изящно при закрытии Windows - PullRequest
3 голосов
/ 15 декабря 2008

Я использую следующий код в приложении VB 6.0, чтобы дать приложению значок в системном трее:

Option Explicit

'user defined type required by Shell_NotifyIcon API call
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

'constants required by Shell_NotifyIcon API call:
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     'Button down
Public Const WM_LBUTTONUP = &H202       'Button up
Public Const WM_LBUTTONDBLCLK = &H203   'Double-click
Public Const WM_RBUTTONDOWN = &H204     'Button down
Public Const WM_RBUTTONUP = &H205       'Button up
Public Const WM_RBUTTONDBLCLK = &H206   'Double-click

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean

Public nid As NOTIFYICONDATA

Я хочу, чтобы приложение свернулось в системный трей, когда вы нажимаете X окна, чтобы закрыть его. Я выполняю это с помощью следующего кода в событии QueryUnload формы:

Me.WindowState = vbMinimized
Me.Hide

В событии Unload формы я делаю следующее:

Shell_NotifyIcon NIM_DELETE, nid

ПРОБЛЕМА заключается в том, что когда я закрываю операционную систему и Windows отправляет в приложение сообщение WM_CLOSE, QueryUnload запускается, но, по-видимому, не событие Unload, поскольку Windows подсказывает мне, что она хочет завершить мою задачу.

Есть идеи, как изящно закрыть приложение при завершении работы Windows?

Спасибо

Ответы [ 2 ]

4 голосов
/ 15 декабря 2008

Это то, что я использую, когда закрываю свои программы для Query_Unload:

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Select Case UnloadMode
        Case 1, 2, 3 'If the program is being terminated by Code, Windows shutting down, or Task Manager
            Cancel = False 'Allow the program termination
            Unload Me
        Case Else
            Cancel = True 'Else disallow the termination
    End Select
End Sub

Если дело 2 (завершение работы Windows), я продолжаю и позволяю программе завершиться.

Дайте мне знать, если это поможет! JFV

1 голос
/ 15 декабря 2008

Вот пример реализации из vbnet http://vbnet.mvps.org/index.html?code/subclass/shellnotifybasic.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...