2013-08-16 63 views
1

是否有可能讓WPF應用程序檢查應用程序的任何其他實例是否正在運行? 我正在創建一個應該只有一個實例的應用程序,並且當用戶試圖再次打開時會提示「另一個實例正在運行」。檢查WPF應用程序的其他實例是否正在運行

我猜我必須檢查流程日誌以匹配我的應用程序的名稱,但我不知道如何去做這件事。

+2

[按名稱獲取進程](http://msdn.microsoft.com/en-us/library/z3w4xdc9.aspx),雖然還有其他許多關於如何執行此操作的問題; [即互斥](http://stackoverflow.com/questions/184084/how-to-force-c-sharp-net-app-to-run-only-one-instance-in-windows) – Sayse

回答

7

如果該exe已被複制並重命名,那麼按名稱獲取進程策略可能會失敗。調試也可能有問題,因爲.vshost被附加到進程名稱。

要創建一個WPF單實例應用程序,您可以通過從App.xaml文件刪除中的StartupUri屬性,以便它看起來像這樣開始......

<Application x:Class="SingleInstance.App" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
</Application> 

之後,你可以去在App.xaml.cs文件並改變它,所以它看起來像這樣...

public partial class App 
{ 
    // give the mutex a unique name 
    private const string MutexName = "##||ThisApp||##"; 
    // declare the mutex 
    private readonly Mutex _mutex; 
    // overload the constructor 
    bool createdNew; 
    public App() 
    { 
     // overloaded mutex constructor which outs a boolean 
     // telling if the mutex is new or not. 
     // see http://msdn.microsoft.com/en-us/library/System.Threading.Mutex.aspx 
     _mutex = new Mutex(true, MutexName, out createdNew); 
     if (!createdNew) 
     { 
      // if the mutex already exists, notify and quit 
      MessageBox.Show("This program is already running"); 
      Application.Current.Shutdown(0); 
     } 
    } 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     if (!createdNew) return; 
     // overload the OnStartup so that the main window 
     // is constructed and visible 
     MainWindow mw = new MainWindow(); 
     mw.Show(); 
    } 
} 

如果存在互斥這將考驗,如果它確實存在,應用程序將顯示一條消息,並退出。否則,應用程序將被構造並且OnStartup覆蓋將被調用。

根據您的Windows版本,提出消息框還會將現有實例推送到Z順序的頂部。如果不是的話,你可以提出另一個關於把窗戶打到頂端的問題。

Win32Api還有其他功能可以幫助您進一步自定義行爲。

該方法爲您提供您之後的消息通知,並確保僅創建主窗口的一個實例。

+0

是否有任何缺陷這個概念?另外,是否有辦法專注於已經運行的實例而不是顯示消息? Thx –

+0

@StefanVasiljevic是的,有幾個。您可以打開一個新問題,並在準備就緒時給我打電話。在這個問題中沒有足夠的空間深入研究消息註冊或Win32 API。 –

+1

很棒的回答。比其他幾個類似問題的答覆要清楚得多。 – ElDoRado1239

相關問題