● タスクトレイにアイコンを設定する - その1 ●

コールバック関数を使わない版。通常はこっちを使いましょう。

Private Type NOTIFYICONDATA
    cbSize As Long            '構造体のサイズ
    hWnd As Long              'マウスメッセージを受け取るウィンドウのハンドル
    uID As Long               'アイコンのID
    uFlags As Long            'フラグを組み合わせて指定する
    uCallbackMessage As Long  'マウスメッセージを受け取る時のメッセージを指定する
    hIcon As Long             '表示するアイコンハンドル
    szTip As String * 64      'ヒントメッセージ
End Type

Private udtNID As NOTIFYICONDATA

'タスクトレイにアイコンを操作する
Private Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

Private Const NIM_ADD = &H0      'アイコン追加
Private Const NIM_MODIFY = &H1   'アイコン変更
Private Const NIM_DELETE = &H2   'アイコン削除

Private Const NIF_ICON = &H2 'アイコンを表示 Private Const NIF_MESSAGE = &H1 'マウスのメッセージを受け取る Private 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

'---------------------------------------------------------------------------
' 関数名: AddIconToTaskTray
' 機能  : タスクトレイにアイコンを挿入する
' 引数  : (in) srcForm … フォーム
' 戻り値: 正常:0以外、 エラー:0
'---------------------------------------------------------------------------
Public Function AddIconToTaskTray(ByVal SrcForm As Form) As Long

    With udtNID
        .cbSize = Len(udtNID)
        .hWnd = SrcForm.hWnd
        .uID = 1
        .uFlags = NIF_ICON Or NIF_MESSAGE Or NIF_TIP
        .uCallbackMessage = WM_MOUSEMOVE
        .hIcon = SrcForm.Icon
        '↑↓この辺は引数増やすなり適当に改造してください。ここではFormから取得。
        .szTip = SrcForm.Caption & Chr$(0)
    End With

    AddIconToTaskTray = Shell_NotifyIcon(NIM_ADD, udtNID)

End Function

'---------------------------------------------------------------------------
' 関数名: DeleteIconFromTaskTray
' 機能  : タスクトレイのアイコンを破棄する
' 引数  : (in) hWnd … フォームのウインドウハンドル
' 戻り値: 正常:0以外、 エラー:0
'---------------------------------------------------------------------------
Public Function DeleteIconFromTaskTray(ByVal hWnd As Long) As Long

    With udtNID
        .cbSize = Len(udtNID)
        .hWnd = hWnd
        .uID = 1
    End With

    'タスクトレイからアイコンを消去する
    DeleteIconFromTaskTray = Shell_NotifyIcon(NIM_DELETE, udtNID)

End Function

標準モジュールの記述はこれだけ。非常に簡単である。

ではメインフォームに以下のようなメニューを作成しましょう。

 
 キャプション(P 名前(M インデックス(X チェック(C
Menu
mnuParent
なし
True
MsgBox
mnuChild
0
True
-
mnuChild
1
True
Exit
mnuChild
2
True

そしてプロパティを以下のように設定しましょう。

 
 プロパティ名  値 
ScaleMode1 - Twip
3 - ピクセル
ShowInTaskbar
False
Visible
False

あとはコーディング↓

Private Declare Function SetForegroundWindow Lib "User32" (ByVal hWnd As Long) As Long

Private Sub Form_Load()

    Call AddIconToTaskTray(Me)

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

    Call DeleteIconFromTaskTray(Me.hWnd)

End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)

    'フォームの ScaleMode 判定(Twip と ピクセル値)
    'でも何で X に WM_RBUTTONUP の値が送られて来るんだ?
    '初めて見たときから不思議で仕方ない…
    Select Case IIf(Me.ScaleMode = vbPixels, X, X \ Screen.TwipsPerPixelX)
        Case WM_RBUTTONUP
            DoEvents

            'おまじない
            'こうすると、メニューが出ている状態でデスクトップをクリックしたら
            'メニューが消えてくれる
            Call SetForegroundWindow(Me.hWnd)

            'ポップアップメニューを表示
            Me.PopupMenu mnuParent
    End Select

End Sub

Private Sub mnuChild_Click(Index As Integer)

    Select Case Index
        Case 0
            Call MsgBox("メッセージボックスは表示されましたか?")
        Case 2
            Unload Me
    End Select

End Sub

戻る