나는 겉으로는 무한한 작업이나 리팩토링이 일어나고있는 동안 오래된 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
올리버
아마도'psi.WindowStyle = ProcessWindowStyle.Hidden'이며'SetParent'가 완료되면 나중에 windowStyle을 복원합니다. –
@ChrisEelmaa 나는 Minimized를 숨기려고 교환하려했는데 깜박임 효과가 거의없는 것으로 보였다. 당신은 그것을 설명 할 어떤 예를 알고 있습니까? – Oli
깜박임이 어떤 프로세스에서 발생합니까? 당신도 결합 할 수 있습니다 :'(ProcessWindowStyle.Minimized | ProcessWindowStyle.Hidden)' –