50

NotifyIcon を使用してトレイに最小化するアプリを正常に作成しました。フォームを手動で閉じると、デスクトップ、タスクバー、および alt-tab から正常に非表示になります。この問題は、アプリを最小化して起動しようとすると発生します。最初の問題は、アプリが最小化されても、alt-tab ダイアログにまだ表示されることでした。FormBorderStyle を (「なし」オプションから) ToolWindow オプションの 1 つに変更すると、これは修正されましたが、別の問題が発生しました。アプリが最初に起動すると、最小化されたウィンドウのタイトルバーがスタート メニューのすぐ上に表示されます。

ここに画像の説明を入力

フォームを開いて閉じると、適切に非表示になります。いろいろ試してみましたが、基本的にはこんな感じです...

WindowState は Designer で Minimized に設定されています。コンストラクターで初期化した後、次の行があります。

this.Visible = false;
this.ShowInTaskbar = false;

NotifyIcon をダブルクリックすると、次のようになります。

 this.WindowState = FormWindowState.Normal;
 this.Visible = true;
 this.ShowInTaskbar = true;

私が言ったように、私はこれ (this.Hide() など) の小さなバリエーションをたくさん試しました。NotifyIcon を実行したままフォームを完全に開始して破棄できるように、NotifyIcon をプライマリ コンポーネントにする方法はありますか? フォームを最小化した状態でアプリを開始する際に、奇妙さを感じさせない方法が必要です。見つけるのを手伝ってください!

4

6 に答える 6

83

これを行う正しい方法は、最初からフォームが表示されないようにすることです。SetVisibleCore() をオーバーライドする必要があります。Show および 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 イベント ハンドラーではなく、フォームのコンストラクターで初期化を行うようにしてください。

于 2009-11-13T22:26:48.203 に答える
23

私はすべての答えを読んでいて、ハックと黒魔術を見ています...(悪気はありません、仲間)

ハックは必要ありません。「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 がウィンドウにいくつかのメッセージを送信できなくなります...そして、フック/ホットキー/etc は仕事をやめる。

于 2011-12-13T08:52:31.053 に答える
21

コンストラクターで、次の2行を削除します。

this.Visible = false;
this.ShowInTaskbar = false;

後に追加InitializeComponent();

this.WindowState = FormWindowState.Minimized;

Designerで、&に設定ShowInTaskbarします。falseFormWindowStateNormal

編集: 同じものをLoadイベントに投稿すると、ウィンドウは最小化されますが、デスクトップでは最小化されたまま表示されます。これはバグだと思います。

于 2009-11-13T17:36:59.423 に答える
2

アプリケーションを最小化し、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;
于 2011-01-26T11:51:13.257 に答える
-1

この「迅速で汚い修正」は私にとってはうまくいきました:

$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()

それが他の誰かに役立つことを願っています...

于 2016-08-31T13:46:36.513 に答える