2012-08-09 5 views
0

내 프로그램은 win forms (C#)에 있습니다. 그것은 외부 프로그램을 열고 그것의 메인 윈도우의 프린트 스크린을 만들고 그것을 닫아야합니다. Process.Start()를 사용하여 프로그램을 열 수 있지만 모든 포커스가 있고 코드가 정지되었습니다. 나 자신을 닫을 때만 양식이 계속되지만 스크린 샷에는 너무 늦습니다. 코드를 강제 실행하려면 어떻게해야합니까? Process.Start(). 내 코드를 계속 사용하십시오.

public void Runttk(string maromnum) 
    { 
     Process runttk = new Process(); 
     runttk.StartInfo.UseShellExecute = true;    
     runttk.StartInfo.FileName = @"C:\\program.exe"; 
     runttk.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
     runttk.Start(); 
     this.Focus(); 
     try 
     { 
      if (runttk.WaitForInputIdle()==true) 
      {           
       PringJpg(maromnum); 
       Killttk(); 
      } 
     } 
     catch (Exception e) 
     { 
     } 

    } 

당신에게

UPDATE 감사합니다 eventuanlly 내가 사용했습니다에 Thread.sleep (3000). Crued하지만 속임수를하십시오. 필자는 피날레 프로그램과 extenral 프로그램 사이의 동기화와 내 코드가 충분히 명확하지 않았기 때문에 배경 작업자를 사용하지 않았습니다.

+1

분리 된 스레드 – dtsg

+0

Process.Start() 프로그램에 즉시 제어권을 반환합니다. 디버거에서 실행하거나 Debug.WriteLine()을 추가하여 코드가 멈추는 위치를 확인하십시오. 아마도 외부 프로그램이 종료 될 때까지 WaitForInputIdle()이 반환되지 않습니다. –

+0

Related : http://stackoverflow.com/questions/2740038/how-do-i-wait-until-a-console-application-is-idle 그래서 여러 프로세스에서 동기화 개체를 사용하십시오. –

답변

1

notepad.exe와 같은 다른 프로그램을 사용하여 코드를 실행하면 Notepad가 실행되고 PringJpg를 호출 한 곳으로 제어가 넘어갑니다.

그래서 문제는 그것이 (runttk.WaitForInputIdle() == true)를 차단하고 있다고 생각합니다.이 작업에 시간 초과를 추가하십시오.

+0

세바스챤에게 시간 제한이 문제라고 말했을 때 - 얼마나 걸릴지 예측할 수 없다. –

1

어쩌면 프로그래머가 유휴 상태가 아니기 때문에 runttk.WaitForInputIdle()==true 앱을 닫을 때까지 기다려야한다는 것을 의미합니다.

제한을 추가하여 (예 : runttk.WaitForInputIdle(500)==true) 귀하의 필요를 충족시켜야합니다.

+0

@Sebastian,이 검사는 콘솔 창이 아닌 win forms 응용 프로그램 인 실행중인 프로세스에 대해 수행됩니다. –

+0

외부 앱이 콘솔 앱인 경우 좋은 점 –

+0

닌자 삭제 했습니까? 내가 쓴 것은 본질적이었다 : 콘솔 윈도우는 (윈도우) UI가 없기 때문에 결코 InputIdle 상태를 입력하지 않고'runttk.WaitForInputIdle()'에 대한 호출이 블로킹된다. –