Visual Basic から直接システム トレイを使用する方法

概要

この資料では、Visual Basic を使用して Windows システム トレイ (タスク バーの通知領域) の機能を活用する方法を紹介します。この方法を使用すると、タスク バーの通知領域に任意のアイコンを配置することができ、そのアイコンにマウス ポインタを合わせると指定のヒントが表示され、アイコンをクリックするとアプリケーションのサイズが復元され、右クリックするとポップアップ メニューが表示されるようにすることができます。このような機能を実装できるのは、Visual Basic ではコールバックを直接処理できるためです。これにより、Shell32.dll に含まれている Shell_NotifyIcon 関数の機能を活用できます。

詳細

以下のサンプル コードは、フォームと標準モジュールが 1 つ以上含まれている Visual Basic プロジェクトであれば、任意のプロジェクトに追加することができます。

手順例

  1. プロジェクトの標準モジュールの宣言セクションに以下のコードを追加します。
          '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
  2. 対象のアプリケーションのシステム トレイ アイコン (通知領域のアイコン) に対して応答を返すプロジェクト内のフォームに、以下のコードを追加します。
          Private Sub Form_Load()
    'the form must be fully visible before calling Shell_NotifyIcon
    Me.Show
    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 = "Your ToolTip" & vbNullChar
    End With
    Shell_NotifyIcon NIM_ADD, nid
    End Sub

    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    'this procedure receives the callbacks from the System Tray icon.
    Dim Result As Long
    Dim msg As Long
    'the value of X will vary depending upon the scalemode setting
    If Me.ScaleMode = vbPixels Then
    msg = X
    Else
    msg = X / Screen.TwipsPerPixelX
    End If
    Select Case msg
    Case WM_LBUTTONUP '514 restore form window
    Me.WindowState = vbNormal
    Result = SetForegroundWindow(Me.hwnd)
    Me.Show
    Case WM_LBUTTONDBLCLK '515 restore form window
    Me.WindowState = vbNormal
    Result = SetForegroundWindow(Me.hwnd)
    Me.Show
    Case WM_RBUTTONUP '517 display popup menu
    Result = SetForegroundWindow(Me.hwnd)
    Me.PopupMenu Me.mPopupSys
    End Select
    End Sub

    Private Sub Form_Resize()
    'this is necessary to assure that the minimized window is hidden
    If Me.WindowState = vbMinimized Then Me.Hide
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    'this removes the icon from the system tray
    Shell_NotifyIcon NIM_DELETE, nid
    End Sub

    Private Sub mPopExit_Click()
    'called when user clicks the popup menu Exit command
    Unload Me
    End Sub

    Private Sub mPopRestore_Click()
    'called when the user clicks the popup menu Restore command
    Dim Result As Long
    Me.WindowState = vbNormal
    Result = SetForegroundWindow(Me.hwnd)
    Me.Show
    End Sub
  3. 上のコードを追加したのと同じフォームで、以下のようにプロパティを設定します。

    プロパティ タスク バーの通知領域のサンプル コードに必要な設定
    -----------------------------------------------------------------------
    Icon = (システム トレイに表示するアイコンを設定)
    Minbutton = True
    ShownInTaskbar = False
  4. メニュー エディタを使用して、同じフォームに以下のメニュー項目を追加します。

    キャプション 名前 有効 表示 階層
    ---------------------------------------------------------
    &SysTray mPopupSys オン オフ メイン メニュー
    &Restore mPopRestore オン オン サブ メニュー
    &Exit mPopExit オン オン サブ メニュー
必要に応じてこの他のメニュー項目を追加することもできます。

タスク バーの通知領域の柔軟性

通知領域のアイコンに対して表示されるヒントを変更するには、Form_Load プロシージャ内の次の行を変更します。
   .szTip = "Your ToolTip" & vbNullChar
"Your ToolTip" の部分を、表示するテキストに置き換えます。


タスク バーの通知領域に表示されるアイコンを変更するには、Form_Load プロシージャの次の行を変更します。
   .hIcon = Me.Icon
Me.Icon の部分をプロジェクトのアイコンに置き換えます。


定数 NIM_ADD を使用した後は任意のタイミングでタスク バーの通知領域の設定を変更することができます。変更するには、nid 変数の値を設定し直してから、以下のように Shell_NotifyIcon API を呼び出します。
   Shell_NotifyIcon NIM_MODIFY, nid.
ただし、コールバックの受信に別のフォームを使用するには、まず "Shell_NotifyIcon NIM_Delete, nid " を使用して現在のアイコンを削除する必要があります。これは、NIM_Modify 関数で新しい Hwnd が受け入れられないためです。または、nid 型に新しい形式 Hwnd を設定した後、"Shell_NotifyIcon NIM_ADD, nid" を使用して、新しいフォーム用のアイコンを systray に追加する必要があります。また、Windows システム トレイにアイコンを表示するフォームごとに個別の nid 型を宣言して、NIM_DELETE および NIM_ADD を使用して、各フォームのアクティブ化イベントで変更します。

関連情報

Visual Basic 4.0 またはそれ以前のバージョンからシステム トレイまたはタスク バーの通知領域を使用する関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。

149276 Windows 95、98、Windows Me のタスク バーの通知領域でアイコンを使用する方法

プロパティ

文書番号:176085 - 最終更新日: 2006/10/17 - リビジョン: 1

フィードバック