c# - 在UWP进程退出时获取

时间:2018-04-27 07:36:18

标签: c# winforms

我想知道我的表单开始流程需要多长时间才能关闭。

目前的实现如下:

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()会抛出异常,指出该进程与任何内容都没有关联。

1 个答案:

答案 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();
    }