web-dev-qa-db-ja.com

トレイに最小化されたWinFormアプリを起動する方法は?

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

enter image description here

フォームを開いて閉じると、フォームが適切に非表示になります。私は多くのバリエーションを試しましたが、基本的には今どのように機能しているのですか...

WindowStateは、デザイナーで最小化に設定されます。コンストラクターでの初期化の後、次の行があります。

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

NotifyIconをダブルクリックすると、次のことがわかります。

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

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

45
jluce50

これを行う正しい方法は、そもそもフォームが表示されないようにすることです。それには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イベントハンドラーではなく、フォームのコンストラクターで初期化を行ってください。

76
Hans Passant

constructorで、次の2行を削除します。

_this.Visible = false;
this.ShowInTaskbar = false;
_

InitializeComponent();の後に追加します:

_this.WindowState = FormWindowState.Minimized;
_

デザイナーで、ShowInTaskbarfalseに設定し、FormWindowStateNormalに設定します。

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

17
Yogesh

私はすべての答えを読んでいて、ハックと黒魔術を見ています...(犯罪、仲間なし)

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

16
Alex

アプリケーションを最小化し、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;
2
Justin Clarke

この「迅速で汚い修正」は私のために働いた:

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

それが他の誰かを助けることを願っています...

0
David R