62

WinFormsアプリをシステムトレイに最小化する適切な方法は何ですか?

注:システムトレイに最小化します。時計のそばのタスクバーの右側にあります。タスクバーを最小化することについては質問していません。これは、ウィンドウの「マイナス」ボタンを押したときに発生します。

「最小化して、ShowInTaskbar = falseに設定してから、NotifyIconを表示する」などのハックなソリューションを見てきました。

このようなソリューションは、アプリが他のアプリのようにトレイに最小化されていないように見えるため、ハックです。コードは、他の問題の中でも特に、ShowInTaskbar=trueを設定するタイミングを検出する必要があります。

これを行うための適切な方法は何ですか?

4

9 に答える 9

18

実際には、ネイティブのwinformでトレイに対してその形式のアニメーションを実行するための管理された方法はありませんが、shell32.dllをP/Invokeして実行できます。

ここにいくつかの良い情報(投稿ではなくコメントで):

http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx

そしてここにそれはC++にあります:

http://www.codeproject.com/KB/shell/minimizetotray.aspx

これを使用して、C#バージョンでPinvokeするものを把握できます。

于 2008-09-06T19:07:50.017 に答える
7
this.WindowState = FormWindowState.Minimized  

それはそれを行うための組み込みの方法であり、ほとんどの場合私には問題ないように見えます。唯一の時は、起動時にそれを呼び出すと、時々奇妙なことがあります。そのため、ほとんどの人はShowInTaskbar = falseを設定し、フォームも非表示にします。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowstate.aspx

于 2008-09-05T21:26:58.617 に答える
5

それは役立ちます:

public partial class Form1 : Form
{
    public static bool Close = false;
    Icon[] images;
    int offset = 0;

    public Form1()
    {
        InitializeComponent();

        notifyIcon1.BalloonTipText = "My application still working...";
        notifyIcon1.BalloonTipTitle = "My Sample Application";
        notifyIcon1.BalloonTipIcon = ToolTipIcon.Info; 
    }

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

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

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

    private void closeToolStripMenuItem_Click(object sender, EventArgs e)
    {
        Close = true;
        this.Close();  
    }

    // Handle Closing of the Form.
    protected override void OnClosing(CancelEventArgs e)
    {
        if (Close)
        {
            e.Cancel = false;
        }
        else
        {
            WindowState = FormWindowState.Minimized;
            e.Cancel = true;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Load the basic set of eight icons.
        images = new Icon[5];
        images[0] = new Icon("C:\\icon1.ico");
        images[1] = new Icon("C:\\icon2.ico");
        images[2] = new Icon("C:\\icon3.ico");
        images[3] = new Icon("C:\\icon4.ico");
        images[4] = new Icon("C:\\icon5.ico");
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        // Change the icon.
        // This event handler fires once every second (1000 ms).
        if (offset < 5)
        {
            notifyIcon1.Icon = images[offset];
            offset++;
        }
        else
        {
            offset = 0;
        }
    }
}
于 2010-08-18T08:26:27.677 に答える
4

このコードはテスト済みで、多くのオプションをサポートしています。

詳細はこちら: http://code.msdn.microsoft.com/TheNotifyIconExample

于 2008-12-29T16:28:15.560 に答える
3

更新:投稿が早すぎたようです。私はまた、私のツールのために以下のハックを使用していました。このための正しい解決策を待っています.........。

これには、Windows.Forms.NotifyIconを使用できます。http://msdn.microsoft.com/en-us/library/system.windows.forms.notifyicon.aspx

NotifyIconをフォームに追加し、いくつかのプロパティを設定すれば完了です。

        this.ShowIcon = false;//for the main form
        this.ShowInTaskbar = false;//for the main form
        this.notifyIcon1.Visible = true;//for notify icon
        this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));//set an icon for notifyicon

    private void Form1_Shown(object sender, EventArgs e)
    {
        this.Hide();
    }
于 2008-09-05T21:55:23.837 に答える
1

上記と同様...

ウィンドウのサイズが変更されるたびにトリガーされるサイズ変更イベントハンドラーがあります(最大化、最小化など)...

    public form1()
    {
       Initialize Component();

       this.Resize += new EventHanlder(form1_Resize);
    } 


    private void form1_Resize(object sender, EventArgs e)
    {
       if (this.WindowState == FormWindowState.Minimized && minimizeToTrayToolStripMenuItem.Checked == true)
       {
             NotificationIcon1.Visible = true;
             NotificationIcon1.BalloonTipText = "Tool Tip Text"
             NotificationIcon1.ShowBalloonTip(2);  //show balloon tip for 2 seconds
             NotificationIcon1.Text = "Balloon Text that shows when minimized to tray for 2 seconds";
             this.WindowState = FormWindowState.Minimized;
             this.ShowInTaskbar = false;
       }
    }

これにより、ユーザーはメニューバーを介してトレイに最小化するかどうかを選択できます。Windows -> に移動し、Minimize to Tray をクリックします。これがチェックされていて、ウィンドウが最小化にサイズ変更されている場合、トレイに最小化されます。私にとって完璧に動作します。

于 2009-02-10T16:19:29.550 に答える
-1

これを機能させるのに問題がある場合は、次のことを確認してください。

this.Resize += new System.EventHandler(this.Form1_Resize);

fom1.designer.cs で

于 2010-08-03T08:51:46.517 に答える
-1

フォームのコンストラクターで:

this.Resize += new EventHandler(MainForm_Minimize);

次に、このイベント ハンドラー メソッドを使用します。

    private void MainForm_Minimize(object sender, EventArgs e)
    {
        if(this.WindowState == FormWindowState.Minimized)
            Hide();
    }
于 2009-02-06T13:31:58.907 に答える