다른 응용 프로그램 (이 경우 메모장)을 시작하는 양식 인 주 스레드가 있고 메모장을 기다리는 BackgroundWorker를 생성합니다. 닫혀 야한다. 닫힌 상태에서 BackgroundWorker는 사용자에게 최상위로 표시 할 다른 Form을 표시합니다. 이 양식은 모달이 아니어야 사용자가 주 스레드 대화 상자의 일부 단추를 누를 수 있습니다. 문제는이 폼 (Form2, BackgroundWorker에서)이 TopMost가 아니라는 것입니다. 사실 true로 설정 한 경우에도 마찬가지입니다. F5를 누르면 작동하지만 ClickOnce 응용 프로그램으로 내 서버에 게시하면 form2는 더 이상 TopMost가 아닙니다. 나는 Form2.Topmost = true, BringToFront, Activate, "MakeTopMost"를 What is powerful way to force a form to bring front?에서 지치 셨다. 아무 것도 작동하지 않는 것 같다.Windows.Form ClickOnce가 활성화되어 게시 될 때 workerthread에서 최상위 호출이 작동하지 않습니다.
심지어 메인 폼의 핸들을 얻고 그것을 form2의 부모로 사용하려고했지만 "InvalidOperationException : Cross-thread operation not valid : 컨트롤 '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();
}
}
다른 아이디어 : 여기
는 코드인가? 아니면 누군가 내 코드를 고칠 수 있습니까? 저는 몇 주 동안이 문제를 다루었 고 어리둥절하게 지내 왔습니다.감사합니다.
사과, 정확합니다. 중요하지 않은 코드를 잘라내는 과정에서 코드를 잘못된 위치에 놓았습니다. WaitForExit은 BackgroundWorker에 있습니다 (위의 코드를 업데이트했습니다). 이는 백그라운드 작업자가 대기 할 수있는 반면 주 스레드는 버튼 클릭을 허용 할 수 있습니다. 나는 form2가 열려있는 동안 사용자가 메인 폼에서 같은 버튼을 클릭 할 수 있기를 원한다. – Tizz
@Tizz DoWork 메소드에서 필요한 것은'p.Start'와'p.WaitForExit'이며,'RunWorkerCompleted' 이벤트에 가입하고 거기서'Form2' 물건 전부를 이동하는 것처럼 보입니다. 이 시점에서 백그라운드 스레드에서 아무 것도 일어나지 않고 UI 스레드에서 사용자의주의를 요구하고있는 것처럼 보입니다. – LarsTech
동일한 BackgroundWorker 스레드에서 RunWorkerCompleted가 아닙니까? 나는 동일한 결과를 얻을 수 없을까? – Tizz