2016-09-23 18 views
0

前回起動したプロセスの特定のダイアログが閉じるまで、プログラムを待機(ブロック)するにはどうすればよいですか?c#起動したプロセスのダイアログが閉じるまで待つ

私はsshキーを読み込むためにpageant.exeを開始しています。 Pageantはクラス "Process"で開始されます。これは正常に動作します。

私のsshキーにはパスフレーズがあります。ですから、私の主なプログラム/プロセス(このプロセスを開始したプロセス)は、ユーザーがsshキーパスフレーズを入力するまで待たなければなりません。

私はどのように待つべきか考えましたが、C#でこれを行う方法がわかりません: ページャがパスフレーズを要求するとダイアログが表示されます。だから私のメインプログラム/プロセスは、パスフレーズダイアログが閉じられるまで待つことができます。これはC#で可能ですか?

私はhereからアイデアを得ました。

EDITは:これはあなたを助けるかもしれませんが、あなたの全体の制御を与えるものではありません

// 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

ここでは、Perlスクリプトをc#に変換するのは一般的ではありません。 [尋ねる]。また、[mcve] – MickyD

+0

の楽しい事実をチェックしてください。http://stackoverflow.com/a/3147920/6248956 – YuvShap

答えて

-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 
+0

ダイアログが開いている場合ではなく、プロセスが実行中であるかどうかを確認するだけです。プラスそれはCPUを最大限に活用する – MickyD

関連する問題