如何防止被禁用的表单被拖动?

时间:2012-05-24 11:51:26

标签: c# .net winforms

以下代码按预期工作,但如果在禁用时“拖动”表单 - 当记事本退出时 - 表单将处于新位置。如何防止这种情况?

Enabled = false;
Process p = Process.Start("notepad");
p.WaitForExit();
Enabled = true;

2 个答案:

答案 0 :(得分:3)

好的,我重新解决了这个问题。问题是你在UI线程上调用WaitForExit()。这阻止了它抽取消息循环和处理输入事件。它们将被放入消息队列中。进程退出后,您的方法返回,UI线程再次开始传送消息。并找到缓冲的鼠标消息,因为窗口不再被禁用而执行它们。

在UI线程上运行的代码的一般规则是永远不会阻止。很多事情都会出错,这只是一个例子。使用Process类很容易,它有一个在进程退出时触发的事件。所以你不需要使用WaitForExit()。使您的代码看起来像这样:

        this.Enabled = false;
        var prc = System.Diagnostics.Process.Start("notepad.exe");
        prc.EnableRaisingEvents = true;
        prc.SynchronizingObject = this;
        prc.Exited += delegate { 
            this.Enabled = true;
            this.Activate();
        };

请注意,必须使用Activate()调用才能将窗口置于前台。这可能并不总是有效。

答案 1 :(得分:1)

您可以尝试从使用showDialog调用的第二个Form运行Process start。

Form2 frm2 =new Form2();

frm2.ShowDialog();

在Form2 Load事件中放置

Process p = Process.Start("notepad");
p.WaitForExit();
this.DialogResult=DialogResult.OK;

必须检查所有可能不完美的语法。

你甚至可以将Form2.Visible设置为false,这样用户甚至都不会看到它。

HomeToast建议

编辑,这很有效,只要你不介意隐藏你的表格,如果你想保持你的表格可见我会按照我的第一个建议

在此选项中,我们将使用Visible = false作为主窗体,而不是Enable = false 如果没有要拖动的表单,则用户无法拖动它。

this.Visible = false;
Process p = Process.Start("notepad");
p.WaitForExit();
this.Visible = true;