我有一个作为表单的主线程,它启动另一个应用程序,在本例中为记事本,然后我生成一个等待记事本关闭的 BackgroundWorker。当它关闭时,BackgroundWorker 会向用户显示另一个要在最顶层显示的表单。这个表单需要是非模态的,以便用户可以点击主线程对话框上的一些按钮。问题是这个表单(Form2,来自 BackgroundWorker)不是 TopMost,即使我将它设置为 true。当我点击 F5 时它可以工作,但是当我作为 ClickOnce 应用程序发布到我的服务器时,form2 不再是 TopMost。我已经厌倦了 Form2.Topmost = true, BringToFront, Activate, "MakeTopMost"什么是强制表单放在前面的强大方法?....似乎没有任何工作。
我什至试图获取主窗体的句柄,并将其用作 form2 的父窗体,但我得到“InvalidOperationException:跨线程操作无效:控制'Form2'从线程之外的线程访问它是创建于。”
这是一个代码片段:
public partial class Form1 : Form
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
private BackgroundWorker endApplicationBackgroundWorker= new BackgroundWorker();
public Form1(string[] args)
{
endApplicationBackgroundWorker.DoWork += new DoWorkEventHandler(endApplicationBackgroundWorker_DoWork);
p.StartInfo.FileName = "notepad";
p.Start();
endApplicationBackgroundWorker.RunWorkerAsync();
//Quit here so we can accept user inputs (button pushes ..)
}
private void endApplicationBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
p.WaitForExit();
Form2 form2 = new Form2();
form2.TopMost = true;
System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcessesByName(form1ProcessName);
if (procs.Length != 0)
{
IntPtr hwnd = procs[0].MainWindowHandle;
if (form2.ShowDialog(new WindowWrapper(hwnd)) == DialogResult.OK)
{
// process stuff
}
}
this.Close();
}
}
还有其他想法吗?或者有人可以修复我上面的代码吗?我已经处理这个问题好几个星期了,而且很慌张。
谢谢!