【.NET】NotifyIconのコンテキストメニューを切り替える

こんにちは、irislabのちひろです。

今日は久しぶりの.Netネタです。
といっても内容自体は昔からあるものなので真新しさはありません。

やりたかったのが、Microsoft .NET Framework(C#, VB.NET)のプログラムでタスクトレイにアイコンを表示する際に使用するNotifyIconコントロールでコンテキストメニューを表示するというものです。

単純に表示するだけならContextMenuプロパティに設定するだけで終わってしまいますが、右クリックと左クリックで表示される内容を変えたかったのでちょっと調べてみました。

左クリックでコンテキストメニューを表示する方法はこちらのサイト「NotifyIconの左クリックでコンテキストメニューを表示させる」を参考にさせてもらいました。

[C#]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void notifyIcon1_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        notifyIcon1.ContextMenuStrip = contextMenuStrip1;
    }
    else if (e.Button == System.Windows.Forms.MouseButtons.Right)
    {
        notifyIcon1.ContextMenuStrip = contextMenuStrip2;
    }
 
    if (notifyIcon1.ContextMenuStrip != null)
    {
        var method = typeof(NotifyIcon).GetMethod("ShowContextMenu", 
            System.Reflection.BindingFlags.NonPublic |
            System.Reflection.BindingFlags.Instance);
        method.Invoke(notifyIcon1, null);
        notifyIcon1.ContextMenuStrip = null;
    }
}

[VB.NET]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Private Sub NotifyIcon1_MouseUp(sender As Object, _
   e As System.Windows.Forms.MouseEventArgs) Handles NotifyIcon1.MouseUp
 
    If e.Button = Windows.Forms.MouseButtons.Left Then
        NotifyIcon1.ContextMenuStrip = ContextMenuStrip1
    ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
        NotifyIcon1.ContextMenuStrip = ContextMenuStrip2
    End If
 
    If NotifyIcon1.ContextMenuStrip IsNot Nothing Then
        Dim method = GetType(NotifyIcon).GetMethod("ShowContextMenu", _
                                                   Reflection.BindingFlags.NonPublic Or _
                                                   Reflection.BindingFlags.Instance)
        method.Invoke(NotifyIcon1, Nothing)
        NotifyIcon1.ContextMenuStrip = Nothing
    End If
 
End Sub

NotifyIcon1が配置されていて、左クリックでContextMenuStrip1、右クリックでContextMenuStrip2を表示できるようにします。

仕組みとしてはタスクトレイのアイコンがクリックされた際に、クリックされたボタンに応じてコンテキストメニューを切り替えて、NotifyIconコントロールのプライベートメソッドをReflectionを利用して呼び出しています。

ポイントは、NotifyIconのContextMenuStripプロパティにあらかじめ何も設定しておかない事でしょうか。
それと上記サイトでも記載されていますが、ClickイベントではなくMouseUpイベントを使用してください。

昔勉強用に作ったプログラムを見ると運用面での改良点が色々と見つかりますね。
ソース自体は……歴史を感じます。


関連する記事


スポンサーリンク


カテゴリー: .Net タグ: , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれないコメントは無視されますのでご注意ください。(スパム対策)