システムトレイでのみ実行される.NET Windowsフォームアプリケーションを作成するにはどうすればよいですか?


216

Windowsフォームアプリケーションをシステムトレイで実行するには、何をする必要がありますか?

トレイに最小化できるアプリケーションではなく、アイコン、ツールヒント、および「右クリック」メニュー以外の何もない、トレイにのみ存在するアプリケーション。



9
ほとんどの回答に欠けているものがあります。アプリケーションを終了するときにアイコンを設定しicon.Visible = falseDispose()アイコンを忘れないでください。それ以外の場合は、プログラムの終了後もアイコンが表示されます。数回テストした後は、どのアイコンが本物かはわかりません。
Tomasz Gandor

あなたはより現代的なWPFのアプローチの後であれば-あなたはこれを試すことができます:codeproject.com/Articles/36788/...
マレーフォックスクロフト

回答:


85

コードプロジェクトの記事「タスクトレイアプリケーションの作成」では、システムトレイにのみ存在するアプリケーションを作成する非常に簡単な説明と例を示しています。

基本的にApplication.Run(new Form1());行を変更して、Program.cs代わりにから継承するクラスを起動し、ApplicationContextそのクラスのコンストラクターでNotifyIcon

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new MyCustomApplicationContext());
    }
}


public class MyCustomApplicationContext : ApplicationContext
{
    private NotifyIcon trayIcon;

    public MyCustomApplicationContext ()
    {
        // Initialize Tray Icon
        trayIcon = new NotifyIcon()
        {
            Icon = Resources.AppIcon,
            ContextMenu = new ContextMenu(new MenuItem[] {
                new MenuItem("Exit", Exit)
            }),
            Visible = true
        };
    }

    void Exit(object sender, EventArgs e)
    {
        // Hide tray icon, otherwise it will remain shown until user mouses over it
        trayIcon.Visible = false;

        Application.Exit();
    }
}

13
これは素晴らしい出発点です。「AppIcon」は、「プロジェクト->プロパティ->リソース->リソースの追加」で追加したリソースの名前でなければならず、プロジェクトを再コンパイルする必要があります。
Lavamantis

1
properties..resources..add resource..icon ..を再コンパイルしても、「エラーCS0103「リソース」という名前は現在のコンテキストに存在しません」
barlop

@barlop私は次のように記述しなければなりませんでした:Properites.Resources.AppIcon
Simon Perepelitsa 19/03/19

@SimonPerepelitsaおかげで、実験で何をしたのかわかりません。何が効果的だったかコメントするつもりでしたが、効果的なことをいくつか忘れてしまったに違いありません。しかし、最終的に私が使用した方法は、ドラッグできるもののパレットから通知アイコンをドラッグすることでした。次に、フォーム上でそれをクリックし、アイコンを選択するメニューを表示する小さな矢印をクリックします。
barlop

17

mat1tが言うように-アプリケーションにNotifyIconを追加し、次のコードのようなものを使用してツールチップとコンテキストメニューを設定する必要があります。

this.notifyIcon.Text = "This is the tooltip";
this.notifyIcon.ContextMenu = new ContextMenu();
this.notifyIcon.ContextMenu.MenuItems.Add(new MenuItem("Option 1", new EventHandler(handler_method)));

このコードは、システムトレイにのみアイコンを表示します。

this.notifyIcon.Visible = true;  // Shows the notify icon in the system tray

(何らかの理由で)フォームがある場合は、次のものが必要です。

this.ShowInTaskbar = false;  // Removes the application from the taskbar
Hide();

コンテキストメニューを取得するための右クリックは自動的に処理されますが、左クリックでアクションを実行する場合は、クリックハンドラーを追加する必要があります。

    private void notifyIcon_Click(object sender, EventArgs e)
    {
        var eventArgs = e as MouseEventArgs;
        switch (eventArgs.Button)
        {
            // Left click to reactivate
            case MouseButtons.Left:
                // Do your stuff
                break;
        }
    }

15

.NET 1.1でトレイバーアプリを作成しましたが、フォームは必要ありませんでした。
まず、プロジェクトのスタートアップオブジェクトを、Mainモジュールで定義されたSubとして設定します。
次に、プログラムでコンポーネントを作成します:NotifyIconおよびContextMenu。「終了」などを
必ず含めてくださいMenuItem
バインドContextMenuNotifyIcon
を呼び出しApplication.Run()ます。
Quitのイベントハンドラでは、MenuItem必ずsetを呼び出してからNotifyIcon.Visible = False、を呼び出しますApplication.Exit()。必要なものをに追加してContextMenu適切に処理します:)


10
  1. ウィザードを使用して新しいWindowsアプリケーションを作成します。
  2. Form1コードから削除します。
  3. を起動するProgram.csのコードを削除しますForm1
  4. NotifyIconクラスを使用して、システムトレイアイコンを作成します(アイコンを割り当てます)。
  5. それにコンテキストメニューを追加します。
  6. またはのNotifyIconマウスクリックに反応して右クリックと左クリックを区別し、コンテキストメニューを設定して、どのボタン(右/左)が押されたかを表示します。
  7. Application.Run()終了するためにアプリを実行し続けるためApplication.Exit()。またはbool bRunning = true; while(bRunning){Application.DoEvents(); Thread.Sleep(10);}。次にbRunning = false;、アプリを終了するように設定します。

Mainの最後に到達し、UIスレッドがない場合、プログラムは実行を停止します。これを解決するにはどうすればよいですか?あなたがそれらの問題を解決したなら、あなたは私の投票を獲得します:)
マシュー・スティープルズ

あなたは私の票を得ます。たぶん、パラメータなしでApplication.Runを呼び出す必要があることだけを述べますか?

App.Runの代わりに更新されました。
Wolf5 2009年

thread.sleepは私が知っている過剰なものですが、Application.Runに代わるより良い「スリープ」ループがある場合は、それを投稿してください:)
Wolf5

Thread.Sleepは悪い考えです。意図したとおりにApplication.Runを実行した場合よりも多くのCPUとバッテリーを使用することになります。
Sneftel

8

「システムトレイ」アプリケーションは、通常のwinフォームアプリケーションです。違いは、Windowsシステムトレイ領域にアイコンを作成することだけです。NotifyIconコンポーネントを使用してsys.trayアイコンを作成するには、それをツールボックス(共通コントロール)で見つけて、そのプロパティ(アイコン、ツールヒント)を変更します。また、マウスクリックやダブルクリックのメッセージを処理することもできます。

もう1つ、ルックアンドフィールまたは標準のトレイアプリを実現するために。メインフォームのshowイベントにfollowinf行を追加します。

private void MainForm_Shown(object sender, EventArgs e)
{
    WindowState = FormWindowState.Minimized;
    Hide();
} 

6

私が知っている限り、フォームを使用してアプリケーションを作成する必要がありますが、フォームにコントロールがなく、表示するように設定することはできません。NotifyIcon(MSDNサンプルはここにあります)を使用して、アプリケーションを作成します。


1
結構です。フォームにはコントロールを含めることができますが、デフォルトでは非表示にする必要があります。
Rune Grimstad

5
フォームは必要ありません。新しいウィンドウアプリ作成ウィザードの後で、Form1を削除し、それを開くコードを削除します。NotifyIconとContextMenuを使用して、Program.csからすべて書き込むことができます。これ以上何も必要ありません。
Wolf5

1
コントロールを含めることができることは知っていますが、OPはそれを望まないのです
Matthew Steeples

2

これは、Visual Studio 2010、.NET 4でどのようにしたかです

  1. Windowsフォームアプリケーションを作成し、プロパティで「単一インスタンスアプリケーションの作成」を設定します。
  2. ContextMenuStripを追加します。
  3. いくつかのエントリをコンテキストメニューストリップに追加し、ダブルクリックしてハンドラーを取得します。たとえば、 'exit'(ダブルクリック)->ハンドラー-> me.Close()などです。
  4. NotifyIconを追加し、デザイナーセットのcontextMenuStripで作成したアイコンにアイコンを選択します( 'common7 ...'の下のVisualStudioフォルダーにいくつかあります)
  5. デザイナーでフォームのプロパティを設定します:FormBorderStyle:none、ShowIcon:false、ShowInTaskbar:false、Opacity:0%、WindowState:Minimized
  6. Form1_Loadの最後にMe.Visible = falseを追加すると、使用時にアイコンが非表示になります Ctrl +Tab
  7. 実行し、必要に応じて調整します。

2

これは、通知領域アプリケーションにとって非常に友好的なフレームワークです... NotificationIconを基本フォームに追加し、自動生成コードを以下のコードに変更するだけで十分です。

public partial class Form1 : Form
{
    private bool hidden = false;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        this.ShowInTaskbar = false;
        //this.WindowState = FormWindowState.Minimized;
        this.Hide();
        hidden = true;
    }

    private void notifyIcon1_Click(object sender, EventArgs e)
    {
        if (hidden) // this.WindowState == FormWindowState.Minimized)
        {
            // this.WindowState = FormWindowState.Normal;
            this.Show();
            hidden = false;
        }
        else
        {
            // this.WindowState = FormWindowState.Minimized;
            this.Hide();
            hidden = true;
        }
    }
}

-2

追加するだけ

this.WindowState = FormWindowState.Minimized;
this.ShowInTaskbar = false;

あなたのフォームオブジェクトに。システムトレイにはアイコンのみが表示されます。


これは、フォームを置きタスクバー。同じではありません。別の投稿に返信しようとしていますか?
LarsTech 2015

1
タスクバーにアイコンはなく、フォームも見えません。視覚的にはプログラムはシステムトレイにのみ存在します。上記の 意味は何ですか?
YTerle 2015

答えにはコンテキストが含まれていません。NotifyIconクラスを使用していますか?そうでない場合、フォームはタスクバーの上左下隅に最小化されます。
LarsTech 2015

1
忙しくなければ、書いて実行してみてください。
YTerle 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.