0

以下代码按预期工作,但如果禁用时“拖动”表单(当记事本退出时),表单将位于新位置。怎么能防止呢?

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

2 回答 2

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() 调用对于将您的窗口放回前台是必要的。这可能并不总是有效。

于 2012-05-24T13:37:00.933 回答
1

您可以尝试从使用 showDialog 调用的第二个表单运行 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;
于 2012-05-24T12:06:59.270 回答