以下代码按预期工作,但如果在禁用时“拖动”表单 - 当记事本退出时 - 表单将处于新位置。如何防止这种情况?
Enabled = false;
Process p = Process.Start("notepad");
p.WaitForExit();
Enabled = true;
答案 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;