我有一个可以使用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;
}
我是否遗漏了一些非常明显的东西,或者是否无法以优雅的方式关闭最小化到托盘的流程?
答案 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();
}
可能不是最优雅的解决方案,但它应该有效(尚未测试)