C#-等待进程退出并关闭“ ShowDialog()”

时间:2019-02-01 06:24:03

标签: c# modal-dialog task

.net的新手,一旦打开,我将无法获得如何关闭显示对话框模态窗口的方法。据我了解,除非明确调用它,否则我们无法自动关闭它。这是我的代码:

//process - notepad.exe 
Process p = Process.Start(process); 
frm_Save fsave = new frm_Save(); 

Using (p)
{ 
    do
    { 
        if(!p.HasExited)    
        {
            p.Refresh();
            fsave.ShowDialog(); // it just stuck here and doesn't go to next line
        }
    } 
    while(!p.WaitForExit(1000)); 
}

//frm_Save.cs 
public frm_Save() 
{ 
    InitializeComponent(); 
}

private void frm_Save_Load(...,....)
{ 
    // 
}

private void frm_Save_Shown(...,...) 
{ 
    Sleep(100); 
    Forms.Application.DoEvents();
    Close(); 
}

2 个答案:

答案 0 :(得分:1)

这种方法可能对您有用,请注意使用TopMost。

using System.Runtime.InteropServices; 

private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
private const UInt32 SWP_NOSIZE = 0x0001;
private const UInt32 SWP_NOMOVE = 0x0002;
private const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;   

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, 
  int X, int Y, int cx, int cy, uint uFlags);

....

frm_Save fsave = new frm_Save(); 
fsave.Show();

SetWindowPos(frm_Save.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);

Process p = Process.Start(process); 

using (p)
{
    while (!p.WaitForExit(1000))
    {
        fsave.Refresh();
    }
}
fsave.Close();

答案 1 :(得分:1)

正如您所解释的,您想要显示一个带有图标的对话框,该对话框将视频保存在后台,并阻止用户执行某些操作。一种常规的方法是在对话框中使用BackgroundWorker。以下是代码的工作方式:

public class frm_Save : Form
{
    public FrmProgress(List<TransferOptions> transferOptions)
    {
        InitializeComponent();
        BackgroundWorker BgrdWorker = new System.ComponentModel.BackgroundWorker();
        this.BgrdWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(this.BgrdWorker_DoWork);
        this.BgrdWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.BgrdWorker_RunWorkerCompleted);
    }

    private void FrmProgress_Load(object sender, EventArgs e)
    {
        // Show image and message...
    }

    private void BgrdWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Call your video Process start Function
        // after that
        var stopWatch = new StopWatch();
        stopWatch.Start()
        while (true)
        {
            if (stopWatch.ElapsedMilliseconds >1000 || videoProcessHasReturnedSuccessfully)
            {
                break
            }
        }
    }

    private void BgrdWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // inform the user the video processing is finished
        this.Close();
    }
}

然后,如果要启动整个过程,则以控制台应用程序的主要形式调用:

frm_Save fsave = new frm_Save(); 
fsave.ShowDialog()

提示:如果需要,您还可以使用BgrdWorker.ProgressChanged通过在后台任务和UI之间进行通信来向用户显示后台任务的进度,但是您没有在问题中要求这样做。