2013-01-24 2 views
2
나는 출력과 F4 종료하기위한 대기를 표시하는 콘솔 응용 프로그램을 읽는 GUI 애플리케이션은, 내가 가진 프로세스를 시작하기 위해 관리 한 적이

:PostMessage를 누구의 출력 리디렉션 및 읽기 콘솔 창에 작동하지 않는 비동기

p.StartInfo.FileName = "consoleapp.exe"; 
p.StartInfo.RedirectStandardOutput = false; 
p.StartInfo.RedirectStandardInput = false; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.CreateNoWindow = false; 
p.StartInfo.WindowStyle = ProcessWindowStyle.Minimized; 
p.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(ConsoleOutputHandler); 
p.Start(); 
p.BeginOutputReadLine(); 

그리고 내가 사용하는 F4를 보낼 수 있습니다

p.StartInfo.RedirectStandardOutput = true; 
: 내가 함께 StandardOutput를 리디렉션 할 때까지

PostMessage(p.MainWindowHandle, (uint)WM_KEYUP, (IntPtr) Keys.F4, (IntPtr) 0x3E0001); 

모든 것이 잘 작동

그런 식으로 PostMessage는 여전히 이벤트 (Spy ++로 검사 됨)를 보내지 만 콘솔 앱은 이벤트를 인식하지 못합니다.

"RedirectStandardInput"변경 작업이 진행되지 않았습니다.

의견이 있으십니까?

+0

이 작업 솔루션이 유래 게시물을 찾고 시도 희망이 당신의 문제를 해결을 http://stackoverflow.com/questions/1145969/processinfo -and-redirectstandardoutput – MethodMan

+0

사실 출력을 리디렉션 할 때 작동을 멈추는 PostMessage로 stdout을 읽는 데 문제가 없습니다. 댓글 주셔서 감사합니다. –

+0

리디렉션하고 StreamWriter를 사용하여 stdin에 쓰려고했지만 너무 효과가 없었습니다. –

답변

0

아마도이 경우 PostMessage을 사용하고 싶지 않을 것입니다. 대상은 콘솔 응용 프로그램이기 때문에, 다음과 같은 라인을 따라,/P를 통해 Win32 API를 WriteConsoleInput를 사용하여 호출 입력 버퍼에 키를 작성해야 :

p.StartInfo.RedirectStandardInput = true ; 
// the rest of your code 

int written ; 
var record = new KEY_INPUT_RECORD 
{ 
    EventType = KEY_EVENT, 
    bKeyDown = true, 
    wVirtualKeyCode = VK_F4, 
    // maybe set other members, use ReadConsoleInput 
    // to get a sample and hard-code it 
    // you might even use a byte array representation 
    // of the input record, since you only need one key 
} ; 

WriteConsoleInput (((FileStream)p.StandardInput.BaseStream).SafeFileHandle, 
    ref record, 1, out written) ; 
+0

WriteConsoleInput을 시도했지만 아직 작동하지 않습니다. Console Handle이 있는데 ConsoleApp에 대한 응답이 없지만 콘솔에 결과가 표시됩니다. 나는 계속 노력할 것이다. 답변 해주셔서 감사합니다. –

+0

감사합니다. 귀하의 의견은이 문제를 해결하는 데 많은 도움이되었습니다. –

1

내가 해냈어!

나는 내 응용 프로그램 시작에서이 작업을 실행

AllocConsole(); 
uint codepage = GetACP(); 
SetConsoleOutputCP(codepage); 

IntPtr handleconsole = new IntPtr(); 
handleconsole = GetConsoleWindow(); 

다음으로 프로세스를 생성 .. 모든 프로세스가 시작된 수행 한 후, 내 앱의 콘솔을 생성

p.StartInfo.RedirectStandardOutput = true; 
p.StartInfo.RedirectStandardInput = false; 
p.StartInfo.RedirectStandardError = true; 

그 콘솔을 상속 따라서 ShowWindow를 호출하여 숨기더라도 stdout을 쉽게 읽을 수 있습니다.

그 후, 나는 F4 키 보낼 INPUT_RECORD을 만들어 :

inHandle = GetStdHandle(STD_INPUT_HANDLE); 
record[0].EventType = KEY_EVENT; 
record[0].KeyEvent.bKeyDown = true; 
record[0].KeyEvent.dwControlKeyState = 0; 
record[0].KeyEvent.wRepeatCount = 1; 
record[0].KeyEvent.wVirtualKeyCode = VirtualKeys.F4; 
record[0].KeyEvent.wVirtualScanCode = MapVirtualKey(VK_F4, MAPVK_VK_TO_VSC); 

record[1].EventType = KEY_EVENT; 
record[1].KeyEvent.bKeyDown = false; 
record[1].KeyEvent.dwControlKeyState = 0; 
record[1].KeyEvent.wRepeatCount = 1; 
record[1].KeyEvent.wVirtualKeyCode = VirtualKeys.F4; 
record[1].KeyEvent.wVirtualScanCode = MapVirtualKey(VK_F4, MAPVK_VK_TO_VSC); 

WriteConsoleInput(inHandle, record, 1, out written);