Я пытаюсь реализовать команду кнопки, которая запускает новое приложение WPF при первом нажатии кнопки пользователем, а затем (когда пользователь снова нажимает кнопку) отправляет его на передний план, если оно уже запущено. Все работает на .Net v4.0
То, что я пытался сделать, работает нормально, как и ожидалось, когда запущенный процесс является обычным приложением WPF, но это не работает хорошо, если запущенное приложение WPF имеет заставку. Проблема в том, что SetForegroundWindow
терпит неудачу, потому что я не могу получить правильный дескриптор окна в этом конкретном случае. Можете ли вы предложить исправление или обходной путь? Предположим, вы можете изменить источник как средства запуска, так и запущенного WPF.
Соответствующий код из View Model лаунчера
private void ClaimRptLogic()
{
if (ClaimRptHandle != IntPtr.Zero)
{
ShowWindow(ClaimRptHandle, SW_RESTORE);
LaunchState = SetForegroundWindow(ClaimRptHandle)? "" : "can't set to foreground";
return;
}
Process rpt = new Process();
rpt.StartInfo = new ProcessStartInfo()
{
WorkingDirectory = ConfigurationManager.AppSettings["ClaimRptPath"],
FileName = ConfigurationManager.AppSettings["ClaimRptexe"]
};
rpt.Start();
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler((o, e) => {
rpt.WaitForExit();
});
bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler((o, e) => {
ClaimRptHandle = IntPtr.Zero;
LaunchState = "ClaimRpt closed";
});
bg.RunWorkerAsync();
Thread.Sleep(3000);
ClaimRptHandle = rpt.MainWindowHandle;
}