winforms 退出C#窗体错误

yb3bgrhw  于 2023-02-16  发布在  C#
关注(0)|答案(1)|浏览(209)

我想写一个程序,根据特定的条件打开特定的窗体。在这个特定的例子中,如果shift键按下,它将调用Form 1。如果该键没有按下,它将检查注册表中的一个键。如果该键不在那里,它将加载Form 1。如果该键在那里,它将做一些检查,加载值,然后加载Form 2。
我看到的奇怪行为是,如果Form 1被加载--无论是通过按住Shift键,还是通过不在那里的reg键,如果用户单击右上角的X,它将返回到它原来的Program.cs代码,而不退出应用程序。
这是来自Program.cs的部分代码。我想在Program.cs中进行检查,所以我没有;不必加载和隐藏表单。

if (Control.ModifierKeys == Keys.Shift)
            {
                //MessageBox.Show("Shift key held down");
                Application.Run(new Form1());
            }

            using (var hkcu = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64))
            using (var key = hkcu.OpenSubKey(@"SOFTWARE\clpCopy"))
            {
                if (key == null)
                {
                    hkcu.Close();
                    //MessageBox.Show("Key not found."); 
                    Application.Run(new Form1());
                    //MessageBox.Show("Returning from Form 1.");                    
                }
            }

在Form 1上,我将Form1_FormClosing添加到Form1.cs中以捕获表单关闭:

private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
        {
            Application.Exit();
        }

但是,当您单击Form 1上的X时,它不会退出应用程序,而是返回到Program.cs并继续执行其余代码。
我在Form 1上有一个“取消”按钮,它可以工作并关闭应用程序。
如果我单击X,如何强制窗体关闭?为什么它返回到Program.cs中的代码?

brgchamk

brgchamk1#

你看到的是预期的行为。
请尝试以下代码:

var f = new Form();
f.Click += (s, e) => Application.Exit();
Application.Run(f);
Console.WriteLine("Hello");

在单击窗体或关闭窗体之前,单词Hello不会显示在控制台上。
Application.Run会一直保持执行,直到Application.Exit()调用或主窗体关闭,然后继续执行。Application.Exit()不会中止线程或关闭进程-它只是关闭所有窗体并清除消息泵,允许调用代码继续。

相关问题