2012-03-28 11 views
0

意図WPFアプリケーションのを実行します。新しいインスタンスが開始されると、すでに実行中のインスタンスはフォアグラウンドに設定されます。WPFアプリケーションの単一インスタンスを確保する:実行中のアプリケーションをフォアグラウンドにリストアするのが難しい

私はを達成しましたが、ほとんどの場合に達しましたが、既に実行中のアプリケーションが通知トレイに座っているときに問題が発生しています。コードはエラーなしで実行されますが、ウィンドウを復元できません。&フォアグラウンドに設定してください。 コードスニペット(C#の):

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

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

[DllImport("user32.dll")] 
private static extern bool ShowWindow(IntPtr hWnd, int cmdShow); 

var currentProcess = Process.GetCurrentProcess(); 

string processName = currentProcess.ProcessName; 
Process[] instances = Process.GetProcessesByName(processName); 

if (instances.Length > 1) 
{ 
    foreach(var instance in instances) 
    { 
     if (!currentProcess.Id.Equals(instance.Id)) 
     { 
      IntPtr hWnd = instance.MainWindowHandle; 

      if (IsIconic(hWnd)) 
       ShowWindow(hWnd, SW_RESTORE); 

      SetForegroundWindow(hWnd); 
     } 
    } 
    currentProcess.Kill(); 
} 

はいずれも私が間違って何をやって指摘することができます。もう一度繰り返すと、すでに実行中のウィンドウが最大化状態になっているが、後ろ向きの状態にある場合に機能します。すでに実行中のウィンドウが通知トレイに最小化されると失敗します。

おかげ

答えて

0

あなたはすでに実行中のプロセスは、システムトレイにあるときに、あなたのコードがShowWindowを実行することを、確認していますか?私は、IsIconicが正しい関数ではないと思っているので、尋ねています。documentationは、「指定されたウィンドウが最小化されているかどうかを判断します」と述べています。プロセスがシステムトレイにある場合、プロセスは最小化されず、隠されます。

代わりにIsWindowVisibleを使用してください。

関連する問題