2016-05-27 4 views
0

私はWPFアプリケーションを持っています。ボタンをクリックしている間にアプリケーション内で、私のビューモデルから下のコードのような新しいアプリケーションを開くための新しいプロセスを作成します。別のプロセスを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のままされていません。

私も以下のコードで試しても、まだウィンドウはnullを返します。

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

誰でも?

+0

ん最上位=真の作品でそれを行うことができると思いますか? – nkoniishvt

+0

@ nkoniishvt:Nop。ウィンドウインスタンスが作成されていません – ViVi

答えて

2

は、私はあなたが次のコード

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

    SetForegroundWindow(process.MainWindowHandle); 

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

正常に動作します。しかし、私は疑いがあります。なぜ管理されていないコードを使用する** [DllImport( "user32.dll")] プライベート静的extern bool SetForegroundWindow(IntPtr hWnd); ** これなしで達成することは可能ですか? – ViVi

+1

dllimportなしで可能ではないかと思います。しかし、新しいプロセスにメッセージを送信するために、ある種の相互プロセス通信を使用することができます。新しいプロセスは、ウィンドウをフォアグラウンドに持ってくることでメッセージに反応することができます – Liero

+1

私はWPFに属していないhWndターゲティングウィンドウだと思うので、常にnullになります。同じアプリケーションドメインにある必要があります –

関連する問題