フォームのシステム メニューのエントリをクリックして、プログラムをシステム トレイに最小化したいと考えています。まず、通知アイコンとコンテキスト メニューを作成しました。
private void InitializeComponent()
{
this.components = new Container();
...
this.notifyIcon = new NotifyIcon();
this.contextMenu = new ContextMenu();
this.contextMenuItem1 = new MenuItem();
this.contextMenuItem2 = new MenuItem();
this.SuspendLayout();
this.notifyIcon.ContextMenu = this.contextMenu;
this.notifyIcon.Text = "Test";
this.contextMenu.Name = "contextMenu";
this.contextMenu.MenuItems.AddRange(new MenuItem[]
{
this.contextMenuItem1,
this.contextMenuItem2
});
this.contextMenuItem1.Name = "contextMenuItem1";
this.contextMenuItem1.Text = "&Show";
this.contextMenuItem1.Click += new EventHandler(this.contextMenuItem1_Click);
this.contextMenuItem2.Name = "contextMenuItem2";
this.contextMenuItem2.Text = "&Exit";
this.contextMenuItem2.Click += new EventHandler(this.contextMenuItem2_Click);
}
次に、システム メニューを拡張しました。
private void Form_Load(object sender, EventArgs e)
{
int hmenu = GetSystemMenu(Handle, 0);
AppendMenu(hmenu, 0xA00, 0, null);
AppendMenu(hmenu, 0, 111, "M&inimize to system tray");
}
このメニュー項目をクリックすると、メイン ウィンドウがフェードアウトします。
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == 0x112)
{
if (m.WParam.ToInt32() == 111)
{
Visible = false;
Hide();
notifyIcon.Visible = true;
}
}
}
コンテキスト メニューをクリックすると、プログラム ウィンドウを再表示するか、アプリケーション全体を閉じる必要があります。
private void contextMenuItem1_Click(object sender, EventArgs e)
{
notifyIcon.Visible = false;
Show();
Visible = true;
}
private void contextMenuItem2_Click(object sender, EventArgs e)
{
Close();
}
私の問題は次のとおりです。新しいエントリをクリックして最小化すると、WndProc メソッドが正常に実行され、フォームは非表示になりますが、システム トレイに「Test」というキャプションを持つアイテムは表示されません。そして、別のウィンドウも表示されます。これは .NET によるものだと思いますが、ウィンドウが完全に空なのでわかりません。通常、プログラムを起動する Windows エクスプローラーの exe ファイルにフォールバックする必要がありますね。
前もって感謝します!
+++ 編集 +++
アプリケーションの背後にある空のウィンドウがコンソール ウィンドウであることがわかりました。winexe パラメータを使用してプロジェクトをコンパイルするのを忘れただけです。