NotifyIconを使用して、トレイに最小化するアプリを正常に作成しました。フォームを手動で閉じると、デスクトップ、タスクバー、およびAltタブから正常に非表示になります。この問題は、アプリを最小化して起動しようとすると発生します。最初の問題は、アプリが最小化されても、alt-tabダイアログに表示されることでした。 FormBorderStyleをToolWindowオプションの1つ(「なし」オプションから)に変更すると、これは修正されましたが、別の問題が発生しました。アプリが最初に起動すると、最小化されたウィンドウのタイトルバーがスタートメニューのすぐ上に表示されます。
フォームを開いて閉じると、フォームが適切に非表示になります。私は多くのバリエーションを試しましたが、基本的には今どのように機能しているのですか...
WindowStateは、デザイナーで最小化に設定されます。コンストラクターでの初期化の後、次の行があります。
this.Visible = false;
this.ShowInTaskbar = false;
NotifyIconをダブルクリックすると、次のことがわかります。
this.WindowState = FormWindowState.Normal;
this.Visible = true;
this.ShowInTaskbar = true;
私が言ったように、私はこれについて多くのマイナーなバリエーションを試しました(this.Hide()など)。 NotifyIconを実行したままでフォームを完全に開始および破棄できるように、NotifyIconをプライマリコンポーネントにする方法はありますか?奇妙さのない最小化されたフォームでアプリを起動する方法がなければなりません。見つけてください!
これを行う正しい方法は、そもそもフォームが表示されないようにすることです。それにはSetVisibleCore()をオーバーライドする必要があります。 Show and Exitコマンドを使用したNotifyIconのコンテキストメニューを想定します。次のように実装できます。
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
notifyIcon1.ContextMenuStrip = contextMenuStrip1;
this.showToolStripMenuItem.Click += showToolStripMenuItem_Click;
this.exitToolStripMenuItem.Click += exitToolStripMenuItem_Click;
}
private bool allowVisible; // ContextMenu's Show command used
private bool allowClose; // ContextMenu's Exit command used
protected override void SetVisibleCore(bool value) {
if (!allowVisible) {
value = false;
if (!this.IsHandleCreated) CreateHandle();
}
base.SetVisibleCore(value);
}
protected override void OnFormClosing(FormClosingEventArgs e) {
if (!allowClose) {
this.Hide();
e.Cancel = true;
}
base.OnFormClosing(e);
}
private void showToolStripMenuItem_Click(object sender, EventArgs e) {
allowVisible = true;
Show();
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e) {
allowClose = true;
Application.Exit();
}
}
Loadイベントのしわに注意してください。メインイベントが最初に表示されるまで発生しません。そのため、Loadイベントハンドラーではなく、フォームのコンストラクターで初期化を行ってください。
constructorで、次の2行を削除します。
_this.Visible = false;
this.ShowInTaskbar = false;
_
InitializeComponent();
の後に追加します:
_this.WindowState = FormWindowState.Minimized;
_
デザイナーで、ShowInTaskbar
をfalse
に設定し、FormWindowState
をNormal
に設定します。
編集: Loadイベントで同じものを投稿すると、ウィンドウは最小化されますが、デスクトップでは最小化されたままです。これはバグだと思います。
私はすべての答えを読んでいて、ハックと黒魔術を見ています...(犯罪、仲間なし)
ハックは必要ありません。 「ShowInTaskbar = false」などを設定する必要さえありません。これを行うだけです:
//"Form Shown" event handler
private void Form_Shown(object sender, EventArgs e)
{
//to minimize window
this.WindowState = FormWindowState.Minimized;
//to hide from taskbar
this.Hide();
}
注:「ShowInTaskbar」プロパティに触れないことを強くお勧めします。たとえば、アプリケーションがシステム全体のホットキーまたは他の類似のもの(フックなど)を登録する場合-ShowInTaskBar = falseを設定してアプリを最小化すると、Windowsがウィンドウにメッセージを送信できなくなります...そして、フック/ホットキー/などは仕事をやめる。
アプリケーションを最小化し、Alt + Tabで非表示にする場合:
また、境界線スタイルをツールウィンドウに設定したときに、[スタート]メニューの近くにタイトルバーが表示されないように、不透明度を設定する必要があります。
イベントの最小化:
this.Visible = false;
this.Opacity = 0;
this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
this.ShowInTaskbar = false;
イベントの正規化:
this.Visible = true;
this.Opacity = 100;
this.FormBorderStyle = FormBorderStyle.FixedSingle; //or whatever it was previously set to
this.ShowInTaskbar = true;
この「迅速で汚い修正」は私のために働いた:
$form1.FormBorderStyle = "fixedtoolwindow"
$form1.top = -1000000
$form1.Left = -1000000
$form1.Width = 10
$form1.Height = 10
$form1.WindowState = "normal"
$form1.ShowInTaskbar = $False
$form1.Opacity = 0
$form1.Hide()
それが他の誰かを助けることを願っています...