Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WPF中引入另一个流程_C#_.net_Wpf_Mvvm - Fatal编程技术网

C# 在WPF中引入另一个流程

C# 在WPF中引入另一个流程,c#,.net,wpf,mvvm,C#,.net,Wpf,Mvvm,我有一个WPF应用程序。在应用程序内部单击按钮期间,我创建了一个新的进程,以打开一个新的应用程序,如下面的代码所示 var process = Process.Start(binaryLocation + @"\TestApp.exe", powDBop + " " + mDBop); processID = process.Id; 它很好用。现在的问题是,如果用户再次单击按钮,我将检查进程是否处于活动状态,如果进程处于活动

我有一个WPF应用程序。在应用程序内部单击按钮期间,我创建了一个新的进程,以打开一个新的应用程序,如下面的代码所示

var process = Process.Start(binaryLocation
                                  + @"\TestApp.exe", powDBop + " " + mDBop);

processID = process.Id;
它很好用。现在的问题是,如果用户再次单击按钮,我将检查进程是否处于活动状态,如果进程处于活动状态,我需要将该应用程序的窗口置于前端

为此,我尝试了以下代码。但它正在失败

var winHandle = Process.GetProcessById(process.Id).MainWindowHandle;
HwndSource hwndSource = HwndSource.FromHwnd(winHandle);
var window = hwndSource.RootVisual as Window;
window.BringIntoView();
window.Activate();
hwndSource未设置并保持为空

我甚至尝试了下面的代码,但窗口仍然返回null

var winHandle = Process.GetProcessById(process.Id).MainWindowHandle;
Window window = (Window) HwndSource.FromHwnd(winHandle).RootVisual;

有人吗?

我想你可以用下面的代码来完成

var process = Process.Start(binaryLocation
                                  + @"\TestApp.exe", powDBop + " " + mDBop);

  SetForegroundWindow(process.MainWindowHandle);

 [DllImport("user32.dll")]
 private static extern bool SetForegroundWindow(IntPtr hWnd);

我想你可以用下面的代码来做

var process = Process.Start(binaryLocation
                                  + @"\TestApp.exe", powDBop + " " + mDBop);

  SetForegroundWindow(process.MainWindowHandle);

 [DllImport("user32.dll")]
 private static extern bool SetForegroundWindow(IntPtr hWnd);

Topmost=真的有效吗?@nkonishvt:Nop。窗口实例未被创建。does Topmost=true有效?@nkonishvt:Nop。窗口实例未被创建工作正常。但我有一个疑问。为什么要使用非托管代码[DllImport(“user32.dll”)]私有静态外部bool setforegroundindow(IntPtr hWnd);没有这一点能实现吗?我怀疑没有德林波特是可能的。但是,您可以使用某种进程间通信来向新进程发送消息。新进程可以通过将窗口带到前台来对消息作出反应。我认为hWnd目标窗口不属于WPF,因此它将始终为空。它应该位于同一应用程序域中。感谢您的帮助。工作正常。但我有一个疑问。为什么要使用非托管代码[DllImport(“user32.dll”)]私有静态外部bool setforegroundindow(IntPtr hWnd);没有这一点能实现吗?我怀疑没有德林波特是可能的。但是,您可以使用某种进程间通信来向新进程发送消息。新进程可以通过将窗口带到前台来对消息作出反应。我认为hWnd目标窗口不属于WPF,因此它将始终为空。它应该位于同一应用程序域中。无论如何,感谢您的帮助。