我想知道我的表单开始流程需要多长时间才能关闭。
目前的实现如下:
var p = new Process();
p.StProcess p = new Process();
p.StartInfo.FileName = EpFile.FullName; //EpFile is FileInfo
p.StartInfo.CreateNoWindow = true;
p.EnableRaisingEvents = true;
p.Exited += (s, e) =>
{
// Some Stuff
};
p.Start();
问题是,如果正常的可执行文件处理给定的文件,但是如果UWP(在我的情况下是电影和电视)处理文件,则这种情况正常。 p.Existed
永远不会启动,并且使用p.WaitForExit()
会抛出异常,指出该进程与任何内容都没有关联。
答案 0 :(得分:0)
在找到更好的答案之前,我尝试了一种(工作)解决方法:
public void Open(FileInfo epFile)
{
Process p = new Process();
p.StartInfo.FileName = epFile.FullName;
p.StartInfo.CreateNoWindow = true;
p.EnableRaisingEvents = true;
p.Start();
try
{
var h = p.Handle; //Needed to know if the process is UWP
p.Exited += (s, e) =>
{
// Code
};
}
catch
{
GetLastWindow().WhenClosed(() =>
{
// Code
});
}
}
private Process GetLastWindow()
=> Process.GetProcesses().OrderBy(GetZOrder).Where(x => !string.IsNullOrEmpty(x.MainWindowTitle)).FirstOrDefault();
[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetWindow(IntPtr hWnd, int nIndex);
const int GW_HWNDPREV = 3;
private int GetZOrder(Process p)
{
IntPtr hWnd = p.MainWindowHandle;
var z = 0;
for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW_HWNDPREV))
z++;
return z;
}
使用此扩展程序:
public delegate void action();
public static void WhenClosed(this Process process, action action)
{
var T = new System.Timers.Timer(1000);
T.Elapsed += (s, e) =>
{
if (IntPtr.Zero == GetWindow(process.MainWindowHandle, GW_HWNDPREV))
{
T.Dispose();
action();
}
};
T.Start();
}