繁体   English   中英

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

[英]How to prevent a disabled Form from being dragged?

下面的代码按预期工作,除了如果在禁用状态下“拖动”表单时(记事本退出时),表单将处于新位置。 如何预防?

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

好的,我可以解决这个问题。 问题是您正在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()调用才能将窗口放回前台。 这可能并不总是有效。

您可以尝试从名为showDialog的第二个Form开始运行Process。

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM