C#关闭流程以优雅的方式最小化到托盘?

时间:2012-01-19 07:19:22

标签: c#

我有一个可以使用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;
}

我是否遗漏了一些非常明显的东西,或者是否无法以优雅的方式关闭最小化到托盘的流程?

2 个答案:

答案 0 :(得分: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);
        }

答案 1 :(得分: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();
}

可能不是最优雅的解决方案,但它应该有效(尚未测试)