アプリをシステムトレイに最小化


114

C#とVisual Studio 2010を搭載したWindowsフォームアプリがあります。

アプリをシステムトレイ(タスクバーではなく)に最小化し、システムトレイをダブルクリックしたときに元に戻すにはどうすればよいですか?何か案が?また、システムトレイのアイコンにいくつかのメニューを作成するにはどうすればよいですか。それを右クリックすると、ログイン、切断、接続などのメニューが表示されます。また、システムトレイから風船が飛び出すように表示する方法はありますか?

PS:すでにnotifyIconを追加しましたが、それを使用する方法がわかりません。


ここから、優れたサンプルコードsimple-talk.com/dotnet/.net-framework/…を
開発者

フォームのDesigner.csに移動してイベントハンドラーを "登録"する必要があります。そうしないと、これらのどれも機能しません(わかりません)。これを行うには、次のように追加します。this.Resize + = new System.EventHandler(this.ManagementForm_Resize);
ブラッド

回答:


149

フォームのResizeイベントを処理します。このハンドラーでは、Resizeイベントの基本機能をオーバーライドして、フォームをタスクバーではなくシステムトレイに最小化します。これを行うには、フォームのResizeイベントハンドラーで次の操作を行います。フォームのWindowStateプロパティがFormWindowState.Minimizedに設定されているかどうかを確認します。はいの場合は、フォームを非表示にし、NotifyIconオブジェクトを有効にして、情報を示すバルーンヒントを表示します。WindowStateがFormWindowState.Normalになったら、Visibleプロパティをfalseに設定してNotifyIconオブジェクトを無効にします。次に、タスクバーのNotifyIconオブジェクトをダブルクリックしたときにウィンドウを再表示します。このために、NotifyIconのMouseDoubleClickイベントを処理します。ここでは、Show()メソッドを使用してフォームを表示します。

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
あなたはForm.FormBorderStyleプロパティ変更することができます msdn.microsoft.com/en-us/library/...
CD ...

tnx!それはうまくいきました...右上のボタンを最小化、閉じる、最大化することを無効にするアイデアもありましたか?tnx
WantIt


tnxそれも働いた!また、システムトレイのアイコンをダブルクリックすると、ウィンドウが他のアプリケーションの一番上に表示されないので、タスクバーのウィンドウをクリックして表示するように努力する必要があります。これをどのように処理できますか?tnx so much
WantIt


69

これが解決策全体を達成するためのものであることがわかりました。上記の答えは、タスクバーからウィンドウを削除することに失敗します。

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

また、フォームデザイナを使用して、通知アイコンコントロールの次のプロパティを設定することをお勧めします。

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
あなたはthis.Show();前に行方不明ですthis.WindowState = FormWindowState.Normal;
developerwjk

1
「ユーザーは何もしない」のタイプミス。;)
Andrew

1
@developerwjk、彼が呼び出していないので、それは欠落していませんHide()。しかし、このアプローチの問題は、Alt-Tabを押してもウィンドウが表示されることです。私は電話Hide()をすることを好みます、そしてそうすればあなたは全くShowInTaskbarプロパティを使う必要はありません。
Andrew

@Andrewとを使用するShow()と問題が発生しHide()ます。非表示にしてから表示し、非表示にすると、再び表示されなくなります。
newbieguy

@newbieguy、あなたの問題は回答へのコメントに適していないため、新しい質問を作成する必要があると思います。使用しているコードとして、より多くの情報を提供する必要があります。使用しようとした回答へのリンクを含めることができます。
Andrew

17

私は一緒に行きます

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

17

notifyIconにアイコンファイルを追加することを忘れないでください。そうしないと、トレイに表示されません。


トピックで最も必要な部分。もう少し情報を追加できますか、デフォルトのアイコンを使用するように強制するにはどうすればよいですか?
T.Todua

12

これを試して

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
を呼び出すのthis.Hide()ではなくタスクバーから非表示にするだけの場合、Alt-Tabを実行してもウィンドウは表示されます。
Andrew、

3

これは私が私のアプリケーションで使用する方法です。それはかなり単純で自明ですが、私はあなたのコメントに答えて詳細を提供させていただきます。

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
これと他のソリューションには1つの問題があります。フォームが他のウィンドウの下に隠されている場合、ユーザーはアイコンをクリックしたときにフォームを最小化したくない場合がほとんどです。代わりに、それを集中する必要があります。ここで私の質問を参照してください:stackoverflow.com/questions/36797442/...
MAF-ソフト

1

システムトレイの画像をクリックすると、フレームが表示されているかどうかを確認できます。Visible= trueまたはfalseを設定する必要があります。


1

...そして右クリック通知メニューの場合、フォームにコンテキストメニューを追加し、それを編集し、ダブルクリックして各contextmenuitemsのmouseclickイベントを設定し、notifyiconプロパティのContextMenuStripを選択して、それをnotifyicon1にアタッチします。


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