1

メイン フォームとシステム タスク トレイ アイコンを持つアプリケーションがあります。メイン フォームのデザイナで、TrayIconコントロールをフォームにドラッグしたので、メイン フォームの子になります。

この時点で、ユーザーがメイン フォームの閉じるボタンを押すと、ユーザーが TrayIcon を右クリックして [終了] をクリックしない限り、アプリケーションが終了しないように実際には非表示になります。ただし、メイン フォームには多くのコントロールとリソースがあり、メイン フォームが非表示の場合でも、これらのリソースのためにメモリを使用します。私の目標は、実際にフォームを破棄して、使用されていないときにそのメモリを占有しないようにすることです。

私が間違っていない限り、メインフォームが非表示になっている場合、そのメモリはもう占有されませんが、そうではないと思います. 私はメモリの専門家ではありません。メモリ管理のしくみについて完全に誤解している可能性さえあるため、この質問は無効です。

とにかく、メインフォームが非表示になっているだけの場合でも、フォームを完全に閉じることで解放できるメモリを消費するという点で正しい場合、アプリケーションを終了せずにメインフォームを実際に閉じる方法はありますか? もしそうなら、メイン フォームのクラスではなく、クラスでTrayIconwith コードを作成する必要がありますね。Program

4

1 に答える 1

2

いいえ、それは確かに必要ではありません。デザイナーの利便性から推奨されていますが、オンデマンドでウィンドウを作成するだけのアプリケーションを簡単に作成できます。代わりにコードを記述する必要があります。基本的な機能を備えたサンプルアプリがあります。Program.cs ファイルを編集して、次のようにします (アイコンが必要です。「SampleIcon」と呼びます)。

static class Program {
    [STAThread]
    static void Main() {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        var cms = new ContextMenuStrip();
        cms.Items.Add("Show", null, ShowForm);
        cms.Items.Add("Exit", null, ExitProgram);
        var ni = new NotifyIcon();
        ni.Icon = Properties.Resources.SampleIcon;
        ni.ContextMenuStrip = cms;
        ni.Visible = true;
        Application.Run();
        ni.Dispose();
    }

    private static void ShowForm(object sender, EventArgs e) {
        // Ensure the window acts like a singleton
        if (MainWindow == null) {
            MainWindow = new Form1();
            MainWindow.FormClosed += delegate { MainWindow = null; };
            MainWindow.Show();
        }
        else {
            MainWindow.WindowState = FormWindowState.Normal;
            MainWindow.BringToFront();
        }
    }

    private static void ExitProgram(object sender, EventArgs e) {
        Application.ExitThread();
    }

    private static Form MainWindow;
}                                                                
于 2013-01-05T17:44:25.400 に答える