2013-03-03 2 views
2

Je voudrais interrompre une commande exécutant cmd.exe. Dans le code ci-dessous, j'utilise ping www.stackoverflow.com -t comme exemple.Envoyer CTRL_C/SIGINT à un processus à partir de C#

public void Run() 
    { 
     System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("cmd.exe"); 

     si.RedirectStandardInput = true; 
     si.RedirectStandardOutput = true; 
     si.RedirectStandardError = true; 
     si.UseShellExecute = false; 
     si.CreateNoWindow = false; 
     //si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 

     System.Diagnostics.Process console = new Process(); 
     console.StartInfo = si; 

     console.EnableRaisingEvents = true; 
     console.OutputDataReceived += proc_OutputDataReceived; 
     console.ErrorDataReceived += proc_ErrorDataReceived; 

     console.Start(); 

     console.BeginOutputReadLine(); 
     console.BeginErrorReadLine(); 

     console.StandardInput.WriteLine("ping www.stackoverflow.com -t"); 

     Thread.Sleep(4000); 
     bool success = GenerateConsoleCtrlEvent((uint)0, (uint)console.SessionId); 
     if (!success) 
     { 
      MessageBox.Show("Error Code: " + Marshal.GetLastWin32Error().ToString()); 
     } 

     char asdf = (char)0x3; 

     console.StandardInput.WriteLine('\x3'); 
     console.StandardInput.WriteLine(asdf); 
     console.StandardInput.Write(asdf); 

     //console.StandardInput.Close(); 

     console.StandardInput.WriteLine(@"exit"); 
     console.WaitForExit(); 
    } 

Le code d'erreur est GenerateConsoleCtrlEvent 6.

j'ai suivi les instructions de:

  1. Can I send a ctrl-C (SIGINT) to an application on Windows?

  2. http://pastebin.com/vQuWQD8F

  3. How to send keys instead of characters to a process?

Cependant, je suis incapable d'interrompre le processus.

Toute aide grandement appréciée,

Répondre

0

Cela peut être un problème très commun avec l'envoi de clés, ainsi que d'autres messages, à une application. Souvenez-vous que si l'application à laquelle vous envoyez a une évaluation d'autorisations supérieure à celle de votre programme, elle n'arrivera généralement pas à envoyer les clés ou le message. Essayez d'exécuter votre programme sous des privilèges d'administrateur. Ou, si vous déboguez via Visual Studio, exécutez Visual Studio sous des privilèges d'administration.

EDIT:

car comment est-ce pas votre problème, vous voulez jeter un oeil à l'aide de la classe ServiceController documentée here. Il permet un contrôle beaucoup plus fin que Process et est fortement recommandé pour la fiabilité dans ces situations. Je vais laisser ma réponse précédente simplement parce que un problème commun que quelqu'un d'autre peut trouver utile

Voici deux tutoriels pour vous aider à démarrer:

http://www.codeproject.com/Articles/31688/Using-the-ServiceController-in-C-to-stop-and-start http://www.c-sharpcorner.com/uploadfile/mahesh/servicecontroller-in-C-Sharp/

Hope this vous aide!

+0

merci, mais ce n'est pas mon problème. juste confirmé que l'exécution de Visual Studio en tant qu'administrateur – Leon

+0

@Leon S'il vous plaît voir mon edit^ – FrostyFire

+0

Je voudrais vraiment pouvoir envoyer des combinaisons de touches juste pour avoir la flexibilité. Il semble que ce soit possible, mais je fais juste quelque chose de mal. – Leon

Questions connexes