2011-12-24 2 views
4

나는 명령 행 응용 프로그램을 시작하고 작동합니다. 그 시간 동안 키 스트로크 (s => show status)를 청취합니다. 's'키를 누르는 일반적인 명령 프롬프트가 아니며 <ENTER> - 키를 누르면 즉시 반응하는 유형입니다. 상태가 표시됩니다.창없는 명령 행 프로세스에 명령 보내기 (C# 응용 프로그램에서 시작)

이제 키 스트로크를 전송하여 멋진 GUI 응용 프로그램에서 명령 줄 응용 프로그램을 "제어"하려고합니다. 나는 Process 'StandardInput에 쓰기의 더 전통적인 접근 방식을 시도했지만 전혀 효과가없는 것 같습니다. 또한 실제 프로세스에는 창 (CreateNoWindow = true로 시작됨)이 없으므로 창에 키 입력을 보내기 위해 Win32 API를 사용할 수 없습니다.

다른 방법이 있습니까?

+4

을 당신이 쓴 명령 줄 응용 프로그램 하나 (또는 ​​적어도 소스 코드가)? 그렇다면 GUI와 명령 줄 도구 모두에서 사용하는 별도의 라이브러리로 다시 사용하려는 비트를 리팩토링합니다. –

+0

Process'StandardInput을 사용할 때 스트림 플러시를 했습니까? – jclozano

+0

@JonSkeet : Heh, 내가 호화 로움을 가졌다면 나는 질문을하지 않을 것이다 : P 나는 단지 애플리케이션이 더 잘 작동하도록 바꿀 뿐이다. 예, 플러시() 명령을 호출하여 스트림을 플러시했습니다. 도와주지 않았어. – Iv4n

답변

1

음, 내 자신의 질문에 대한 답변을 찾은 것 같습니다. 그것은 진짜 "함께 kludged"솔루션이지만, 작동합니다 - 그리고 내가 만들고있는 응용 프로그램의 모든 의도와 목적에 상관 없습니다.

그럼, 내가 한 것은 첫 번째는 /보기를 각각 1과 0으로 nCmdShow을 변경하여 창을 숨기기 할 수 있습니다

static extern bool ShowWindow(IntPtr WindowHandle, int nCmdShow); 
static extern bool SetForegroundWindow(IntPtr WindowHandle); 

전화 사용이 개 WinAPI를 기능이었다. 다른 하나는 윈도우 (WindowHandle에 의해 결정됨)를 앞에 배치합니다. 이 둘을 결합하여 프로그래밍 방식으로 콘솔 창을 가져올 수 있었고 간단한 SendKeys.Send(); 작업을 한 다음 다시 숨 깁니다.

// Use a WIN API command to bring the command line to front 
SetForegroundWindow(workerProcess.MainWindowHandle); 
// Send a keystore to re-display the STATUS of the worker 
SendKeys.Send("s"); 
// Hide the window again. 
ShowWindow(workerProcess.MainWindowHandle, 0); 

이제는 실제 kludge 작업이지만 작업이 완료됩니다. 한 가지 잠재적 인 함정은 사용자가 컴퓨터를 다른 용도로 사용하는 경우이며, 창이 'q'로 활성화되어있는 10000000 순간에 1을 못 박는다면 작업자 프로그램을 종료합니다. 그러나이 응용 프로그램은 모니터, 키보드 또는 마우스가 연결되어 있지 않아도 문제가되지 않는 전용 컴퓨터에 사용하기위한 것입니다.

답장을 보내 주신 모든 분들께 감사드립니다. 일방적으로 또는 다른 방법으로 나를 올바른 해결책으로 인도하십시오.

2

멋진 콘솔 응용 프로그램에는 문제가 있습니다.

표준 입력을 거치지 않고 키보드 입력을 직접 읽는 경향이 있습니다. 또한 표준 출력을 거치지 않고 콘솔을 직접 제어하는 ​​경향이 있습니다.

AFAIK, 프로그래밍 방식으로 이러한 앱을 제어 할 수있는 방법은 없습니다. 정말로, 이 정말로 인 경우, 과 같은 앱을 개인 desktop (AHK는 가상 키보드/마우스 드라이버를 사용합니다)에서 제어 할 수 있습니다. 그래도 콘솔에서 결과를 읽는 방법을 모르겠습니다. 그것 귀하의 프로그램 (개인 데스크톱)에서 시작하고 대상 애플 리케이션을 시작하는 중간 콘솔 애플 리케이션을 만들 수 있습니다. 중간 앱은 share its console이고 대상 앱은 low-level I/O을 사용하여 변경 사항을 감지합니다.

또는 Detours을 사용하여 대상 앱을 사용자의 의도대로 구부릴 수 있습니다.

+0

답해 주셔서 감사합니다. 사실, 나는 그것을 쉽게 읽을 수 있습니다. 입력 만 보내는 것이 문제인 것처럼 보입니다. 그 두 가지를 체크하고 그 중 어떤 것이 작동하는지 살펴 보겠습니다. 편집 : 키 스트로크 (키보드에 입력 된 것처럼)를 보내는 것이 STDIN에 쓰는 것만 큼 표준이 아닙니다. :) – Iv4n

+1

실제로 무기 경쟁이 있습니다. 한쪽에는 * 진짜 * 키보드에서 읽으려는 앱이 있고 다른쪽에는 그 앱을 가짜로 만들고 싶은 앱이 있습니다. 'WM_KEYDOWN','keybd_event','SendInput' ('SendKeys') 등등. 가상화를 거부 한 프로그램이 있기 때문에 한 번 가상 키보드 드라이버를 작성하기로 계약했습니다. 군비 경쟁에서 가상화는 항상 승리합니다. :) TPM이 사용될 때까지. :( –

1

동시에 사용자 입력과 창 전환에 문제를 일으킬 수있는 이론적 인 위험없이이 기능을 수행하는 훨씬 더 좋은 방법을 발견했습니다.

트릭은 PostMessage라는 WinAPI 함수를 사용하여 KeyDown (또는 KeyUp) 메시지를 동일한 작업을 수행하는 프로세스로 보냅니다. 프로세스 창을 앞으로 가져 와서 즉시 숨길 필요가 없습니다!

내가 인수로 키 'S'로 키 다운 명령을 보낸다 :

 // 0x0100 - VM_KEYDOWN 
     // 0x0101 - VM_KEYUP 
     // 0x53 - S-key 
     PostMessage(workerProcess.MainWindowHandle, 0x0100, 0x53, 0); 
     PostMessage(workerProcess.MainWindowHandle, 0x0101, 0x53, 0); 
+0

PostMessage? 어디서 왔는가? –

+1

WinAPI 함수 – Iv4n

관련 문제