У меня есть основной поток, который является формой, которая запускает другое приложение, в данном случае Блокнот, затем я запускаю 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();
}
}
Есть еще идеи? Или кто-то может исправить мой код выше? Я занимаюсь этим вопросом уже несколько недель и растерялся.
Спасибо!