2017-04-02 72 views
0

我控制它已經開始這樣的控制檯進程:發送CTRL-C的過程 - 而不是結束它

  AvrGdb = new Process(); 
     AvrGdb.StartInfo.CreateNoWindow = true; 
     AvrGdb.StartInfo.UseShellExecute = false; 
     AvrGdb.StartInfo.FileName = "avr-gdb.exe"; 
     AvrGdb.StartInfo.RedirectStandardOutput = true; 
     AvrGdb.StartInfo.RedirectStandardInput = true; 
     AvrGdb.StartInfo.RedirectStandardError = true; 

我發送短命令字符串到「命令行」和接收數據。但是,需要發送的命令之一是CTRL + C。這並沒有關閉進程,而是將其發送到一個單獨的微控制器中控制調試器(該過程是avr micros的'avr-gdb'調試器)。

我試過StandardInput.Write('\x3')StandardInput.Write(char.ConvertFromUtf32(3));都沒有成功(即沒有任何反應,我正在寫入的過程)。存在於這個主題

許多其他議題,但一般的提問實際上想要結束進程使用這個命令,這樣做的其他方式進行告知。

一個答覆,我發現了這個建議,我認爲可能的工作(使用進口C++ GenerateConsoleCtrlEvent()'):

  Process avrgdb = Process.GetProcessesByName("avr-gdb")[0]; 
     GenerateConsoleCtrlEvent(CTRL_C_EVENT, (uint)avrgdb.SessionId); 

但它沒有 - 顯然是「SESSIONID」需求是一個'processGroup',它不能在c#中訪問(或不存在?),只能在C++中使用。

如果我知道改寫C++而不是C#將解決這個我整個過程交互,那麼我可能會嘗試這樣做,但一個大的學習曲線參與了該辦法。請任何其他想法?

+2

爲什麼downvote,請?我能改善我的問題嗎?如果是這樣,如何 - 有用的反饋讚賞。 – quilkin

回答

0

我想我找到了一個解決方案(通過this post);有人編寫了一個C++應用程序'SendSignal'。這通常會發送CTRL + Break,但我修改了源並重新編譯爲發送CTRL + C.

從第一個開始控制第二個過程的第三個過程看起來很麻煩,但它起作用。

相關問題