表单的所有者,不在Application.Run中

时间:2013-12-10 12:16:35

标签: c# winforms forms

我正在尝试在应用程序启动之前显示一个表单并获取其DialogResult,所以我只是创建它并使用ShowDialog(因为Application.Run的返回值是空隙)。

我担心的是,它可能会被当时可能显示的其他表格错误地“劫持”。显然,不是这个应用程序。请参阅What is the meaning of Form.Show(null)?,建议不要使用ShowDialog的无参数重载。

我已经测试并看到Form的Owner属性为null。但它会永远如此吗?或者我应该创建一个表单并将其用作所有者而不显示它?这似乎是一个奇怪的解决方案,但逻辑上它应该避免任何问题。或者会引入新的?

4 个答案:

答案 0 :(得分:3)

  

不是这个应用程序,显然

这已经由Windows负责,它强制在线程拥有的进程和窗口之间进行强有力的分离。例如,对话框所有者的典型选择是GetActiveWindow()返回的窗口。活动窗口是线程的属性。例如,这解释了为什么从工作线程发出的MessageBox.Show()调用永远不会模态到其他窗口。

在技术上可以对另一个进程的窗口进行窗口模式,但需要付出很多努力。该应用程序必须调用AttachThreadInput(),这是一个非常不起眼的winapi函数,没有人偶然打电话。也是一个很好的死锁来源。

除非你在索马里海岸附近的船上编程,否则没有充分的理由担心你的窗户被劫持。

答案 1 :(得分:0)

[STAThread]
        static void Main()
        {
            Form1 form1 = new Form1();
            //here I  suppose the form you want to show  
            Form1 form2 = new Form2();
            form2.ShowDialog(form1);  

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(form1);
        }

答案 2 :(得分:0)

基本上,当此窗口没有父项时,您使用ShowDialog()。通常这发生在主窗口。如果你打开一个接一个的窗口,而在关闭之前的窗口,则会有多个ShowDialog() s。

如果您正在显示对话框(也是一个窗口),那么您可以指定它的父级来实现某种行为。例如,当alt-tabbing到该窗口时,它的对话框将显示在前面。把这看作是做父子关系。

我不知道这个案子,当多个表格声称同一个父母。但这听起来像是一个明显的错误,例如:

 public Form1 FormMain = new Form1();
 ...
 // show main form
 FormMain.ShowDialog();
 ...
 // somewhere in the main form - show dialog
 Form2 form2 = new Form2();
 form2.ShowDialog(FormMain);
 ...
 // somewhere in form2 - show dialog
 Form3 form3 = new Form3();
 form3.ShowDialog(FormMain); // wrong, should be form2!

答案 3 :(得分:0)

这是未经过测试的,因为我无法重新创建父类除了null之外的任何情况(即对第三方未管理父级的引用),但也许你可以做类似这样的事情在您的表单上将父级设置为null,如果它发生更改:

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
        this.ParentChanged += MyParentChanged;
    }

    public void MyParentChanged(Object sender, EventArgs e)
    {
        this.Parent = null;
    }
}