2013-03-03 2 views
2

Я хотел бы прервать команду, выполняющуюся через cmd.exe. В приведенном ниже коде я использую ping www.stackoverflow.com -t в качестве примера.Отправить CTRL_C/SIGINT в процесс из 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(); 
    } 

Код ошибки от GenerateConsoleCtrlEvent является 6.

Я следовал инструкциям из:

  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?

Однако я не могу прервать процесс.

Любая помощь очень ценится,

ответ

0

Это может быть очень распространенная проблема с отправкой ключей, а также некоторые другие сообщения, приложению. Помните, что если приложение, которое вы отправляете, имеет более высокую оценку прав доступа, чем ваша программа, обычно не удастся отправить ключи или сообщение. Попробуйте запустить вашу программу под административными привилегиями. Или, если вы отлаживаете Visual Studio, запустите Visual Studio под административными привилегиями.

EDIT:

видя, как это не ваша проблема, которую вы хотите взглянуть на использовании ServiceController класса документированную here. Он позволяет намного более тонкий контроль, чем Process, и настоятельно рекомендуется для надежности в этих ситуациях. Я оставлю мой предыдущий ответ, просто потому, что его общую проблема, что кто-то может найти полезную

Вот две обучающих программы, чтобы вы начали:

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/

Надеется, что это поможет вам!

+0

спасибо, но это не моя проблема. просто подтвердил, что запуск Visual Studio в качестве администратора – Leon

+0

@Leon Пожалуйста, см. мой edit^ – FrostyFire

+0

Мне бы очень хотелось, чтобы я мог отправлять комбинации клавиш, чтобы у меня была гибкость. Похоже, это возможно, но я просто делаю что-то неправильно. – Leon

Смежные вопросы