c#等到启动过程的对话关闭

时间:2016-09-23 07:55:13

标签: c# ssh process dialog pageant

如何关闭(阻止)我的程序,直到我之前启动的进程的特定对话框关闭?

我启动pageant.exe加载ssh密钥。 Pageant以#34; Process"开始。这很好。

我的ssh密钥有密码。所以我的主程序/进程(这个程序启动了进程)必须等到用户输入ssh密钥密码。

我知道如何等待,但不知道如何在c#中执行此操作: 如果选美要求密码,则会出现一个对话框。所以我的主程序/进程可以等到密码短语对话框关闭。是否可以在c#中执行此操作?

我从here得到了这个想法。

编辑:找到了解决方案

// wait till passphrase dialog closes
if(WaitForProcessWindow(cPageantWindowName))
{ // if dialog / process existed check if passphrase was correct
    do
    { // if passphrase is wrong, the passphrase dialog is reopened
        Thread.Sleep(1000); // wait till correct passphrase is entered
        } while (WaitForProcessWindow(cPageantWindowName));
    }
}

private static bool WaitForProcessWindow(string pProcessWindowName)
{
    Process ProcessWindow = null;
    Process[] ProcessList;
    bool ProcessExists = false; // false is returned if process is never found


    do
    {
        ProcessList = Process.GetProcesses();
        ProcessWindow = null;
        foreach (Process Process in ProcessList)
        { // check all running processes with a main window title
            if (!String.IsNullOrEmpty(Process.MainWindowTitle))
            {
                if (Process.MainWindowTitle.Contains(pProcessWindowName))
                {
                    ProcessWindow = Process;
                    ProcessExists = true;
                }
            }
        }
        Thread.Sleep(100); // save cpu
    } while (ProcessWindow != null); // loop as long as this window is found
    return ProcessExists;
}

1 个答案:

答案 0 :(得分:-1)

这可能对你有所帮助,但并不能完全控制你。我不熟悉选美,所以我不确定它是否继续在后台运行。但是如果程序自动关闭,您可以在应用程序中执行此操作。

因此,如果Pageant应用程序处于打开状态,您可以检查循环,一旦打开,您执行一些代码,一旦关闭,您再次启用该程序。

在某个后台工作程序中执行此代码。

    //Lets look from here if pageant is open or not. 

    while(true)
    {
        if (Process.GetProcessesByName("pageant").Length >= 1)
        {
             //block your controls or whatsoever.
             break;
        }
    }

    //pageant is open 

    while(true)
    {
         if (!Process.GetProcessesByName("pageant").Length >= 1)
         {
             //enable controls again
             break;
         }
    }

    //close thread