読者です 読者をやめる 読者になる 読者になる

C#アプリをタスクトレイに格納(その2)

C#

2008-04-04 - babydaemonsの日記で書いたが、ウィンドウのアニメーションをさせずにタスクトレイに格納&元に戻す方法があった。

【C#】タスクトレイ表示によるFormの表示切替制御 - QA@ITがヒントになったが、this.WindowStateを変更するのではなくbase.Show()とbase.Hide()でFormの表示を制御する方法だ。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    // cf. http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=21135&forum=7
    //Windowイベントの捕捉処理!
    protected override void WndProc(ref Message m)
    {
        //※下記例は、最小化ボタンクリックで、FormをHideするだけの処理にしている。
        // 最小化されません!
        // その他の場合には、既定の処理をさせる!→base.WndProc(ref m) ;
        // Msgが、WM_SYSCOMMAND(0x112)
        // WParamが、SC_MINIMIZE(0xF020)
        if ((m.Msg == 0x112) && (m.WParam == (IntPtr)0xF020))
        {
            base.Hide(); // 隠す
        }
        else
        {
            base.WndProc(ref m);
        }
    }
    
    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        base.Show(); // 表示する
        this.Visible = true; // フォームの表示
        base.Activate(); // フォームをアクティブにする
    }

    private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.UserClosing)
        {
            e.Cancel = true; // 終了処理のキャンセル
            base.Hide(); // 隠す
        }
    }

    private void 終了XToolStripMenuItem_Click(object sender, EventArgs e)
    {
        notifyIcon1.Visible = false; // アイコンをトレイから取り除く
        Application.Exit(); // アプリケーションの終了
    }
}

http://d.hatena.ne.jp/toburau/20080128のエントリは対象がゲームだからアニメーション有りが良いのだろうけど、実用(?)のアプリケーションの場合はアニメーション無しが良い感じ。