2010-04-01 5 views
2

J'essaie de m'intégrer à une application de fournisseurs en l'appelant avec les arguments de commande de C#. Il est destiné à automatiser un processus que nous devons faire sans avoir besoin d'interagir avec l'application. S'il n'y a pas d'erreurs lors de l'exécution du processus, cela fonctionne très bien.Application de console affichant la boîte de message sur l'erreur

Cependant, s'il y a des erreurs, l'application du fournisseur affichera une boîte de message avec le code d'erreur et le message d'erreur et attendra que quelqu'un clique sur le bouton OK. Lorsque vous cliquez sur le bouton OK, l'application quitte l'application et renvoie le code d'erreur en tant que code de sortie.

Comme mon application va être un service Windows sur un serveur, le fait d'avoir besoin de quelqu'un pour cliquer sur un bouton OK sera un problème. Je me demandais quelle serait la meilleure solution pour contourner cela.

Mon code appelant l'application fournisseur est ...

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = "someapp.exe" 
startInfo.Arguments = "somefile.txt"; 

Process jobProcess = Process.Start(startInfo); 
jobProcess.WaitForExit(); 

int exitCode = jobProcess.ExitCode; 
+2

La détection d'erreurs à l'aide d'une boîte de message dans une application de console est une mauvaise conception de type r-e-a-l-l-y. C'est juste affreux. –

+0

Comparé au reste de l'application des vendeurs, cette partie est plutôt bonne. :( – holz

Répondre

1

code très rapide, méchant et sale ci-dessous. Ce que vous voulez vraiment faire est d'avoir une boucle qui cherche une boîte de dialogue particulière chaque seconde ou et envoie lui entrer si elle le voit. Cela devrait vous rendre sur la colline pour l'instant, cependant (non testé, BTW):

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.FileName = "someapp.exe" 
startInfo.Arguments = "somefile.txt"; 

Process jobProcess = Process.Start(startInfo); 

//wait for the process to potentially finish...if it generally takes a minute to end, wait a minute and a half, etc 
System.Threading.Thread.Sleep(60 * 1000); 

Process[] processes = Process.GetProcessesByName("someapp"); 

if (processes.Length == 0) 
{ 
    break; //app has finished running 
} 
else 
{ 
    Process p = processes[0]; 
    IntPtr pFoundWindow = p.MainWindowHandle; 
    SetFocus(new HandleRef(null, pFoundWindow)); 
    SetForegroundWindow((int)pFoundWindow); 
    SendKeys.SendWait("{ENTER}");   
} 

int exitCode = jobProcess.ExitCode; 

Option B est de modifier leur application de la console - trouver l'appel MessageBoxA et le remplacer par MOV EAX, 1 de sorte que la boîte de dialogue ne se présente jamais et c'est comme si l'utilisateur avait cliqué sur 'OK'.

+0

J'ai essayé quelque chose comme ceci, mais cela ne fonctionne pas quand mon application fonctionne en tant que service Le MainWindowHandle sur le processus est zéro – holz

+0

http://social.msdn.microsoft.com/Forums/fr -US/netfxbcl/thread/d4dd2efd-353e-4c9c-ab08-b6d264aa1c9d Donnez-lui un tourbillon. – szevvy

Questions connexes