C#如何以优雅的方式将最小化到托盘的进程关闭?

6
我有一个应用程序,可以使用Form显示窗口。只有在使用-debug标志运行应用程序时,该表单才会显示,否则它仅会显示在托盘中。
var form = new Form();
if(DebugMode)
    form.Show();

应用程序在调试模式下运行时,会在窗体显示时监听CloseMainWindow()。如何使应用程序在不显示窗体的情况下也监听CloseMainWindow()呢?如果不处于调试模式,我不希望用户能够与窗体交互。
我尝试过几种方法,比如显示窗口但将大小设置为0。这会显示一个小窗体,即不是隐藏的窗体。
if (!DebugMode)
{
    form.Show();
    form.Size = new Size(0, 0);
}

也不能通过显示再隐藏来解决问题:
if (!DebugMode)
{
    form.Show();
    form.Hide();
}

虽然显示了,但最小化并且不在任务栏中显示也不起作用:

if (!DebugMode)
{
    form.Show();
    form.WindowState = FormWindowState.Minimized;
    form.ShowInTaskbar = false;
}

我是否漏了什么非常明显的东西,或者关闭最小化到托盘的进程不可能以一种优雅的方式?

4
不确定是否重要,但在你最后的例子中,我会在显示表单之前设置属性。 - f2lollpll
可能是重复的问题:this.Visible is not working in Windows Forms - Hans Passant
2个回答

1
如果我理解问题正确,您希望在非调试模式下完全隐藏表单(即该窗口在任务管理器中未显示),当有人通过任务管理器结束进程时,您希望执行一些清理代码或只是接收通知。
基于这个假设,以下代码应该可以工作。
 public static bool DebugMode = false;

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var form = new Form1();
            form.Load += (s, e) =>
                             {
                                 if (!DebugMode)
                                 {
                                     form.Opacity = 0;
                                     form.ShowInTaskbar = false;
                                 }
                             };

            form.FormClosing += (s, e) =>
                                    {
                                        // Breakpoint hits
                                    };

            Application.Run(form);
        }

0

我不确定你能通过 Process.CloseMainWindow() 来完成。我记得没有可见主窗口的进程,其 MainWindowHandle 被设置为 IntPtr.Zero

你需要一些解决方法。我的建议是手动跟踪 MainWindow Handles:

static void Main()
{
     ...
     MainWindow mainWindow = new MainWindow();
     [HandleRepository] = mainWindow.Handle;
     Application.Run(mainWindow);
}

然后当你想要关闭进程时,使用一个解决方法:

public void EndProcess()
{
     Form mainWindow= (MainWindow)Form.FromHandle([HandleRepository]);
     mainWindow.Close();
}

可能不是最优雅的解决方案,但应该可以工作(尚未测试)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接