是否有可能讓WPF應用程序檢查應用程序的任何其他實例是否正在運行? 我正在創建一個應該只有一個實例的應用程序,並且當用戶試圖再次打開時會提示「另一個實例正在運行」。檢查WPF應用程序的其他實例是否正在運行
我猜我必須檢查流程日誌以匹配我的應用程序的名稱,但我不知道如何去做這件事。
是否有可能讓WPF應用程序檢查應用程序的任何其他實例是否正在運行? 我正在創建一個應該只有一個實例的應用程序,並且當用戶試圖再次打開時會提示「另一個實例正在運行」。檢查WPF應用程序的其他實例是否正在運行
我猜我必須檢查流程日誌以匹配我的應用程序的名稱,但我不知道如何去做這件事。
如果該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還有其他功能可以幫助您進一步自定義行爲。
該方法爲您提供您之後的消息通知,並確保僅創建主窗口的一個實例。
是否有任何缺陷這個概念?另外,是否有辦法專注於已經運行的實例而不是顯示消息? Thx –
@StefanVasiljevic是的,有幾個。您可以打開一個新問題,並在準備就緒時給我打電話。在這個問題中沒有足夠的空間深入研究消息註冊或Win32 API。 –
很棒的回答。比其他幾個類似問題的答覆要清楚得多。 – ElDoRado1239
[按名稱獲取進程](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