C# WinForms アプリを最小化してトレイに表示する適切な方法は何ですか?
質問
WinForms アプリをシステム トレイに最小化する適切な方法は何ですか?
注記:最小化する システムトレイ;タスクバーの右側、時計の横にあります。私はタスクバーへの最小化について尋ねているのではありません。これは、ウィンドウの「マイナス」ボタンを押したときに起こることです。
「最小化し、ShowInTaskbar = false に設定して、NotifyIcon を表示する」といったハック的な解決策を見てきました。
このような解決策は、アプリが他のアプリのようにトレイに最小化されないようであること、ShowInTaskbar = true に設定するタイミングをコードで検出する必要があることなど、ハッキング的です。
これを行う適切な方法は何ですか?
解決
実際には、ネイティブ winform のトレイにその形式のアニメーションを実行する管理された方法はありませんが、P/Invokeshell32.dll を実行して実行できます。
ここにいくつかの良い情報があります(投稿ではなくコメントで):
http://blogs.msdn.com/jfoscoding/archive/2005/10/20/483300.aspx
そしてこれが C++ です:
http://www.codeproject.com/KB/shell/minimizetotray.aspx
これを使用して、C# バージョンでどのようなものを Pinvoke するかを判断できます。
他のヒント
this.WindowState = FormWindowState.Minimized
それはそれを行うための組み込みの方法であり、ほとんどの場合、私にとっては問題ないようです。唯一奇妙な点があるのは、起動時に呼び出す場合で、時々奇妙な点があるため、ほとんどの人は ShowInTaskbar = false を設定し、フォームも非表示にします。
http://msdn.microsoft.com/en-us/library/system.windows.forms.form.windowsstate.aspx
それは次のことに役立ちます:
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;
}
}
}
このコードはテストされており、多くのオプションをサポートしています。
アップデート:投稿が早すぎたようです。私も自分のツールに以下のハックを使用していました。これに対する適切な解決策を待っています....
これには 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();
}
上記と同様...
ウィンドウのサイズが変更される(最大化、最小化など)たびにトリガーされるサイズ変更イベント ハンドラーがあります。
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」→「トレイに最小化」をクリックします。これがチェックされ、ウィンドウがサイズ変更されて最小化されると、トレイに最小化されます。私にとっては完璧に機能します。
フォームのコンストラクター内:
this.Resize += new EventHandler(MainForm_Minimize);
次に、このイベント ハンドラー メソッドを使用します。
private void MainForm_Minimize(object sender, EventArgs e)
{
if(this.WindowState == FormWindowState.Minimized)
Hide();
}
これを機能させるのに問題がある場合は、次のことを確認してください。
this.Resize += new System.EventHandler(this.Form1_Resize);
fom1.designer.cs内