2015-01-02 6 views
0

나는 겉으로는 무한한 작업이나 리팩토링이 일어나고있는 동안 오래된 VB6 exes WPF를 무리하게 호스팅하는 작업이 있습니다.WPF에서 EXE 호스팅 seemlessly

EXE를 호스팅하는 것은 너무 까다 롭지 만 프로세스를 보이지 않게 만드는 것은 아닙니다.

현재 흐름 : 1)보기 만들기 2) VM 삽입 3) 시작 및 실행 EXE. 4) WaitForInputIdle 5)는, setParent 6) SetWindowLong에 7)를 SetWindowPos

내가 무엇입니까 문제입니다 지금까지 나는 그것이 setParent가 불려 갔을 때 그것을 호출 할 수 있습니다 전에 프로세스가 자연스럽게로드가 알고으로이 방법 . 즉, WPF 컨트롤에 놓이기 전에 응용 프로그램의 깜박임이 있음을 의미합니다.
나는이 방법을 찾을 수있는 방법을 찾고 싶습니다. 순전히 메모리에서 또는 숨겨진 프로세스를 여는 방법이 있습니까 (UseShellExecute가 true로 설정되어 있고 WindowStyle = ProcessWindowStyle.Minimized로 설정되어 있습니다).

내가 알지 못하는 과정을 완전히 열 수있는 다른 방법이있을 수 있습니다.

private Process OpenProcess(string path) 
    { 

     Process p = null; 
     lock (locked) 
     { 
      ProcessStartInfo psi = new ProcessStartInfo(); 
      psi.FileName = path; 
      psi.UseShellExecute = true; 
      psi.WindowStyle = ProcessWindowStyle.Minimized; 
      p = Process.Start(psi); 
      BreadCrumb += " OpenProcess: " + p.Id; 

      p.EnableRaisingEvents = true; 
      p.WaitForInputIdle(); 

     } 
     return p; 
    } 

은 GitHub의에 샘플을 업로드하는 과정을 열기

의 ViewModel 생성자

public ShellViewModel() 
    { 
     WindowWidth = 600; 
     WindowHeight = 500; 
     MainTitle = "Main Title"; 
     BreadCrumb = "NA"; 
     IsLoading = true; 

     Task.Factory.StartNew(() => 
     { 
      //Process p = OpenProcess(@"C:\\Windows\\System32\\notepad.exe"); 
      Process p = OpenProcess(@"C:\\Program Files\\WinRAR\\WinRar.exe"); 

      return p; 

     }).ContinueWith(r => 
     { 
      try 
      { 
       Process p = r.Result; 

       _handler = p.MainWindowHandle; 
       _host.Child = _panel; 
       Content = _host; 

       int dwStyle = GetWindowLong(_handler, GWL_STYLE); 
       SetParent(_handler, _panel.Handle); 
       SetWindowLong(_handler, GWL_STYLE, new IntPtr(dwStyle & ~WS_CAPTION & ~WS_THICKFRAME)); 
       SetWindowPos(_handler, IntPtr.Zero, 0, 0, (int) Math.Round(WindowWidth), (int) Math.Round(WindowHeight) - 106, SWP_FRAMECHANGED); 

       BreadCrumb += " Host: " + p.Id.ToString(CultureInfo.InvariantCulture); 

       IsLoading = false; 
      } 
      catch (Exception e) 
      { 
       MessageBox.Show(e.Message); 
      } 

     }, UiTaskSchedulerHelper.Instance.UiTaskScheduler); 
    } 

, 그것을 갱신 주시기 바랍니다.

https://github.com/OliDow/FormHostPoc/tree/master/FormHostPoc

올리버

+0

아마도'psi.WindowStyle = ProcessWindowStyle.Hidden'이며'SetParent'가 완료되면 나중에 windowStyle을 복원합니다. –

+0

@ChrisEelmaa 나는 Minimized를 숨기려고 교환하려했는데 깜박임 효과가 거의없는 것으로 보였다. 당신은 그것을 설명 할 어떤 예를 알고 있습니까? – Oli

+0

깜박임이 어떤 프로세스에서 발생합니까? 당신도 결합 할 수 있습니다 :'(ProcessWindowStyle.Minimized | ProcessWindowStyle.Hidden)' –

답변

0

그래서 한 쌍의 프로그래밍의 하루 우리가 의도 한대로로드 얻었다. 레포가 올바르게 작동합니다. 우리는 또한 로딩 VB6 Apps를 설정 파일에서 최소화되도록 설정해야했습니다.