2016-09-23 2 views
0

Comment puis-je attendre (bloquer) mon programme jusqu'à la fermeture d'un dialogue spécifique de mon processus démarré précédent?C# Attendre la fermeture du dialogue du processus démarré

Je commence pageant.exe pour charger une clé ssh. Pageant est commencé avec la classe "Process". Cela fonctionne bien.

Ma clé ssh a un mot de passe. Donc, mon programme/processus principal (celui-ci a démarré le processus) doit attendre que l'utilisateur entre la phrase secrète de la clé SSH.

J'ai une idée de la façon d'attendre, mais je ne sais pas comment le faire dans C#: Si le recueil demande la phrase secrète, une boîte de dialogue apparaît. Mon programme/processus principal peut donc attendre que la boîte de dialogue de phrase de passe soit fermée. Est-il possible de le faire en C#?

j'ai eu l'idée de here.

EDIT: a trouvé une solution

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

Nous ne sommes généralement pas ici pour convertir le script Perl en C# pour vous. [demander]. Aussi les faits checkout amusants à [mcve] – MickyD

+0

Cela peut aider http://stackoverflow.com/a/3147920/6248956 – YuvShap

Répondre

-1

Cela pourrait vous aider, mais ne vous donne pas le contrôle entier. Je ne suis pas familier avec la reconstitution historique, donc je ne suis pas sûr si elle continue de fonctionner en arrière-plan ou non. Mais au cas où le programme se ferme automatiquement, vous pouvez le faire dans votre application.

Ainsi, vous pouvez vérifier dans une boucle si l'application Pageant est ouverte ou non, une fois qu'il est ouvert, vous exécutez un code et une fois qu'il est fermé, vous activez à nouveau le programme.

exécuter ce code dans certains travailleurs de fond.

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

Tout ce qui fait est de vérifier si le processus est en cours d'exécution ou non, pas si une boîte de dialogue est ouverte. De plus, il maximise le processeur – MickyD