コールバック関数を使わない版。通常はこっちを使いましょう。
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 Const NIM_ADD = &H0 'アイコン追加 Private Const NIM_MODIFY = &H1 'アイコン変更 Private Const NIM_DELETE = &H2 'アイコン削除
'--------------------------------------------------------------------------- ' 関数名: 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 標準モジュールの記述はこれだけ。非常に簡単である。 ではメインフォームに以下のようなメニューを作成しましょう。
そしてプロパティを以下のように設定しましょう。
あとはコーディング↓ 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 |