Q090. WPF でタスクトレイアイコンを表示するには?

A.WindowsForms の NotifyIcon クラスを使用します。
WPF では残念ながらタスクトレイアイコンの機能が提供されていません。以下の記事で触れられてますが、WPF はプレゼンテーションライブラリだからということで、MS さんはサポートする気がさらさらないようです。

参考記事WPFでタスクトレイにアイコンを表示する


WPF で NotifyIcon 使うのは昔から定番らしく、ネットで検索すると様々な記事やサンプルがヒットしましたが VB は見当たらなかったのでサンプルを書いてみました。ついでに Livet を使い NotifyIcon のインスタンスを ViewModel 内で管理するように実装してみました。なにかの参考になれば幸いです。


MainWindowViewModel.vb

Option Explicit On
Option Strict On

Imports System.Windows.Forms

Public Class MainWindowViewModel
    Inherits ViewModel

    Private WithEvents _notifyIcon As NotifyIcon

#Region "Dispose Support"

    Protected Overrides Sub Dispose(disposing As Boolean)
        MyBase.Dispose(disposing)
        If (disposing) Then
            _notifyIcon.Dispose()
        End If
    End Sub

#End Region

#Region "イベント"
    ''' <summary>
    ''' タスクトレイアイコン・コンテキストメニュークリック時のイベントハンドラ
    ''' </summary>
    Private Sub ExitItemClick(sender As Object, e As EventArgs)
        ' タスクトレイアイコンを終了します
        _notifyIcon.Dispose()
    End Sub

    Private Sub NofityIconBalloonTipClicked(sender As Object, e As EventArgs) Handles _notifyIcon.BalloonTipClicked
        System.Windows.MessageBox.Show("バルーンがクリックされました!")
    End Sub
#End Region

#Region "TrayIconCommand"
    Private _TrayIconCommand As ViewModelCommand

    Public ReadOnly Property TrayIconCommand() As ViewModelCommand
        Get
            If _TrayIconCommand Is Nothing Then
                _TrayIconCommand = New ViewModelCommand(AddressOf TrayIcon)
            End If
            Return _TrayIconCommand
        End Get
    End Property

    Private Sub TrayIcon()
        ' バルーンヒントのタイトル
        _notifyIcon.BalloonTipTitle = "メッセージが届きました!"
        ' バルーンヒントに表示するメッセージ
        _notifyIcon.BalloonTipText = "ひらぽん様からお知らせです!"
        ' バルーンヒントに表示するアイコン
        _notifyIcon.BalloonTipIcon = ToolTipIcon.Info
        _notifyIcon.ShowBalloonTip(100000)
    End Sub
#End Region

    Public Sub Initialize()
        ' コンテキストメニューを作成
        Dim exitItem = New ToolStripMenuItem() With {.Text = "終了"}
        AddHandler exitItem.Click, AddressOf ExitItemClick
        Dim menuStrip = New ContextMenuStrip()
        menuStrip.Items.Add(exitItem)

        'タスクトレイアイコンを初期化
        _notifyIcon = New NotifyIcon() With {
            .ContextMenuStrip = menuStrip,
            .Text = "タスクトレイサンプル",
            .Icon = New System.Drawing.Icon("app.ico"),
            .Visible = True
        }
    End Sub

End Class


MainWindow.xaml

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
        xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
        xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
        xmlns:local="clr-namespace:TaskTrayVB"
        Title="MainWindow" Height="180" Width="300">
    <Window.DataContext>
        <local:MainWindowViewModel/>
    </Window.DataContext>
    
    <i:Interaction.Triggers>
        <!--WindowのContentRenderedイベントのタイミングでViewModelのInitializeメソッドが呼ばれます-->
        <i:EventTrigger EventName="ContentRendered">
            <l:LivetCallMethodAction MethodTarget="{Binding}" MethodName="Initialize"/>
        </i:EventTrigger>

        <!--Windowが閉じたタイミングでViewModelのDisposeメソッドが呼ばれます-->
        <i:EventTrigger EventName="Closed">
            <l:DataContextDisposeAction/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Grid>
        <Button Content="Button" Height="32" Name="Button1" Width="98" 
                Command="{Binding Path=TrayIconCommand}" />
    </Grid>
</Window>


WPF FAQ の目次に戻る