web-dev-qa-db-ja.com

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

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

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

201
xyz

NotifyIconを使用する基本的な答えは正しいですが、.NETの多くのことと同様に、それを行うには微妙な点がたくさんありますright。 Bradが言及したチュートリアルでは、非常に基本的な手順を詳しく説明していますが、これらのいずれにも対処していません。

  • システムトレイからアプリケーションを閉じると、開いている子フォームが適切に閉じられますか?
  • アプリケーションは、それ自体のインスタンスを1つだけ実行することを強制します(すべてではありませんが、ほとんどのトレイアプリに適用可能)?
  • 必要に応じて、WPF子ウィンドウおよびWinForms子ウィンドウを開く方法。
  • 動的コンテキストメニューをサポートする方法。
  • 標準のNotifyIconはWinFormsスペースに存在します。純粋なWPFソリューションを作成できますか? (はい、できます!)

Simple-Talk.comで公開された記事で、これらのポイントを詳細に取り上げ、すぐに使用できるトレイアプリケーションフレームワークと、実際のすべてを表示する完全な実世界のサンプルアプリケーションを提供しました。 。NETでのトレイアプリケーションの作成:実践ガイド 、2010年11月公開を参照してください。

149
Michael Sorens

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

基本的にProgram.csApplication.Run(new Form1());行を変更して、代わりに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();
    }
}
68
Fawzan Izy

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;
        }
    }
17
ChrisF

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

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

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

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

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

私が知る限り、フォームを使用してアプリケーションを作成する必要がありますが、フォーム上にコントロールがなく、表示されることはありません。 NotifyIcon(MSDNサンプルの here )を使用して、アプリケーションを記述します。

6

これが Visual Studio 201 、.NET 4

  1. Windows Formsアプリケーションを作成し、プロパティで「Make single instance application」を設定します
  2. ContextMenuStripを追加する
  3. コンテキストメニューストリップにいくつかのエントリを追加し、それらをダブルクリックしてハンドラーを取得します。たとえば、「exit」(ダブルクリック)-> handler-> 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
Evolved

これは、通知領域アプリケーションにとって非常に使いやすいフレームワークです... 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;
        }
    }
}

単に追加する

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

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

0
YTerle