9

私は小さな C# (.NET 4.0) コンソール アプリケーションを持っています。ユーザーがシステム トレイ アイコンを右クリックしたときにメニューを表示して操作できるようにしたいと考えています。問題なくトレイにアイコンを追加できますが、メニューが表示されません。私は次のコードを使用しています:

NotifyIcon trayIcon = new NotifyIcon();
trayIcon.Text = "TestApp";
trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40);

ContextMenu trayMenu = new ContextMenu();

trayMenu.MenuItems.Add("Blah", item1_Click);
trayMenu.MenuItems.Add("Blah2", item1_Click);
trayMenu.MenuItems.Add("Blah3", item1_Click);

trayIcon.ContextMenu = trayMenu;
trayIcon.Visible = true;

...アイコンをトレイに入れます。ただし、アイコンを右クリックしても何も起こりません。のさまざまな順列を試しましMenuItems.Addたが、メニューが表示されません。私は単純なものが欠けていると確信しています - 何かアイデアはありますか?

4

4 に答える 4

20

アイコンを作成した後、これを追加してみてください。

Application.Run()

このメソッドは戻らないので、呼び出した後は何もできないことに注意してください。これは、他のすべての作業を別のスレッドで行う必要があることを意味します。

何が起こるかというと、トレイ アイコンが右クリックされたことを知らせるメッセージが OS からアプリケーションに送信されますが、トレイ アイコンのコードは (これらのメッセージは によって処理されるApplication.Runため) それを認識せず、メニューを開いて応答することはできません。

于 2012-10-10T10:47:20.530 に答える
9

に関してApplication.Run()は、これは他のすべてのコードを別のスレッドに配置する代わりに、メイン スレッド以外のスレッドで、、、などNotifyIconmenu作成することです。events

Application.Run()これにより、標準のアプリケーション メッセージ ループが現在のスレッドで動作できるようになるため、これを含める必要があります。次に、イベントが同じスレッドで作成されたため、Application.Exit()を使用して通知メッセージを閉じることができますが、メイン スレッドは引き続き続行できます。コンソール アプリの小さな例を次に示します...

class Program 
{
    public static ContextMenu menu;
    public static MenuItem mnuExit;
    public static NotifyIcon notificationIcon;

    static void Main(string[] args)
    {
        Thread notifyThread = new Thread(
            delegate()
            {
                menu = new ContextMenu();
                mnuExit = new MenuItem("Exit");
                menu.MenuItems.Add(0, mnuExit);

                notificationIcon = new NotifyIcon()
                {
                    Icon = Properties.Resources.Services,
                    ContextMenu = menu,
                    Text = "Main"
                };
                mnuExit.Click += new EventHandler(mnuExit_Click);

                notificationIcon.Visible = true;
                Application.Run();
            }
        );

        notifyThread.Start();

        Console.ReadLine();          
    }

    static void mnuExit_Click(object sender, EventArgs e)
    {
        notificationIcon.Dispose();
        Application.Exit();
    }

}
于 2013-03-28T13:23:04.467 に答える
1

解決策は次のとおりですApplication.Run()。コンソールモードでのGUIのイベントが機能しないため、使用する必要があります。ただし、次のソリューションを使用できます。

var task = System.Threading.Tasks.Task.Factory.StartNew(() => ShowTrayIcon());

void ShowTrayIcon()
{
    some code with tray icon ...
}

これにより、新しいスレッドで試行アイコンのセットアップが開始されます...

于 2013-12-05T20:14:06.700 に答える
0

トレイ アイコンのマウス クリックのイベント ハンドラを追加しましたか?

trayIcon .MouseDown += new MouseEventHandler(trayIcon_MouseDown);

コンテキスト メニューを作成し、trayIcon_MouseDown 関数内で次のように実行します。

private void trayIcon_MouseDown (object sender,MouseEventArgs e)
{
  //add you menu items to context menu
  contextMenu.Items.Add(item);
  contextMenu.IsOpen = true;  
}

これを試して。これがあなたを助けると思います。

于 2012-10-10T11:17:42.757 に答える