我正在尝试从我的WPF应用程序启动一个进程。该进程也是使用PRISM / MEF框架开发的WPF应用程序。
import { AlertController } from 'ionic-angular';
export class MyPage {
constructor(public alertCtrl: AlertController) {
}
showAlert() {
let alert = this.alertCtrl.create({
title: 'New Friend!',
subTitle: 'Your friend, Obi wan Kenobi, just accepted your friend request!',
buttons: ['OK']
});
alert.present();
}
}
问题在于PRISM / MEF应用程序,因为进程WaitForInputIdle()不起作用。我尝试在WaitForInputIdle()之后打印mainwindowHandle及其零。
虽然我尝试打开像notepad.exe这样的其他进程,但WaitForInputIdle()工作并打印窗口句柄。
现在我正在使用此解决方法,但有人可以说明为什么WaitForInputIdle()无法正常工作吗?
var process = Process.Start(processPath);
process.WaitForInputIdle();
Console.WriteLine(process.MainWindowHandle);
//rest of the code
答案 0 :(得分:1)
Process.WaitForInputIdle()
method只是等待进程的消息循环进入空闲状态。与您的循环一样WaitForInputIdle()
也是一种变通方法,它没有专门编码以等待创建MainWindowHandle
。因此,根据应用程序的工作方式,无法保证在方法返回时创建窗口句柄。
至少大多数Windows的内置应用程序使用与Windows窗体应用程序相同的方法来启动应用程序并创建第一个窗口。在这些情况下,标准行为是,当创建窗口句柄并显示窗口时,进程将进入空闲状态。
WPF,Prism和MEF的工作方式与WinForms略有不同,因此无法保证在应用程序最终进入空闲状态时已创建窗口句柄。不幸的是,我不太喜欢WPF,Prism或MEF,所以我甚至无法提供关于这种行为的理论。