2010-04-22 4 views
0

나는 간단한 응용 프로그램 (.net C#을 사용하여 작성)을 cmd.exe에서 시작하고 그 콘솔에 쓸 필요가 있지만 문제는 cmd.exe 프로세스의 프로세스 ID가 필요하다는 것입니다. 나는 모든 실행 과정을 얻을 수있다.응용 프로그램이 시작되는 cmd.exe 프로세스 ID를 찾는 방법은 무엇입니까?

Process[] procList = Process.GetProcessesByName("cmd"); 

그러나 나의 발견하는 방법? :)

아마도 입력을 읽고 "ApplicationName.exe"가 내부에 쓰여 있는지 확인하거나 현재 cmd.exe 창을 활성화 하시겠습니까? 그러나 어떤 기능이 있습니까?

+0

Windows 앱이 콘솔 창에 다시 쓸 필요가있는 이유는 무엇입니까?Windows 응용 프로그램 팝업을 넌 모달 (non-modal) 형식으로 만들고 거기에 출력을 넣는 것이 어떻습니까? Windows 응용 프로그램이 cmd.exe 창에서 시작되었다고 어떻게 보장 할 수 있습니까? –

+0

학부모 과정? – leppie

+0

중복 : http://stackoverflow.com/questions/394816/how-to-get-parent-process-in-net-in-managed-way –

답변

0

"당신"의 cmd를 발견하더라도 어떻게 작성 하시겠습니까?

설명하는 것을 달성하는 더 좋은 방법이 있습니다. 그냥 "콘솔 응용 프로그램"으로 프로젝트를 컴파일하지만 어쨌든 그것은 WinForms 창을 만들 수 있습니다. 예, 가능합니다. 아무 것도 없습니다. 그런 다음 System.Console 클래스를 사용하여 콘솔에 쓸 수 있으며 마법은 필요하지 않습니다.

0

다음 코드는, 새로운 프로세스를 감지하는 WQL 이벤트 조회를 작성 시작하는 새로운 공정을 대기 한 후 프로세스에 대한 정보를 표시합니다

WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1), "TargetInstance isa \"Win32_Process\""); 
ManagementEventWatcher watcher = new ManagementEventWatcher(query); 
ManagementBaseObject e = watcher.WaitForNextEvent(); 
Console.WriteLine("Process {0} has been created, path is: {1}", 
((ManagementBaseObject)e["TargetInstance"])["Name"], 
((ManagementBaseObject)e["TargetInstance"])["ExecutablePath"]); 
watcher.Stop(); 

난 당신에 대한 해결책을 찾을 수 있습니다 생각을 당신의 이 WMI 코드 샘플을 검토하여 문제를 해결하십시오. 희망이 도움이됩니다.

0

프로젝트에 클래스 어딘가에서이 기능을 추가 은 (클래스의 상단에 using System.Runtime.InteropServices; 필요)

[DllImport("kernel32.dll")] 
    private static extern bool AttachConsole(int dwProcessId); 
    [DllImport("kernel32.dll")] 
    private static extern bool FreeConsole(); 

그런 다음 AttachConsole(-1)가 이제 쓸 평소처럼 System.Console 클래스를 사용할 수 있습니다 전화 콘솔과 색상 및 기타 등등을 설정합니다. 더 이상 콘솔에 쓸 필요가없는 경우 FreeConsole()으로 전화하여 프로세스를 분리하십시오.

실제로 콘솔이 추가 명령을 처리하는 것을 차단하지 않는다는 점에 유의하십시오. 사용자는 언제든지 콘솔에 아무 것도 입력 할 수 없습니다. 다음과 같이

권장되는 방법은 다음과 같습니다

  1. 는 콘솔 응용 프로그램 당신이 원하는 무엇이든 그것에
  2. 쓰기를 만듭니다.
  3. 더 이상 필요하지 않으면 FreeConsole()으로 전화하십시오.
  4. Application.Run()을 사용하여 양식을 엽니 다. application.Run을 사용하지 않고 양식 만 표시하면 적절한 메시지 루프가 작성되지 않으며 이상한 일이 발생할 수 있습니다.

Application.Run 메서드를 호출하자마자 코드는 양식이 닫힐 때까지 계속되지 않습니다. 따라서 폼의 콘솔에 쓰고 거기에서 자유롭게하거나 다른 의도하지 않은 부작용이있는 별도의 스레드에 폼을 생성하십시오.

AttachConsole 함수에 프로세스 ID를 제공 할 수 있습니다. -1은 당신이 원하는 것 같은 가장 좋은 부모 프로세스를 기본으로합니다.

관련 문제