可能重複:
What is the correct way to create a single instance application?如何檢查WPF應用程序是否已在運行?
我如何檢查我的應用程序已經打開?如果我的應用程序已經運行,我想顯示它而不是打開一個新的實例。
可能重複:
What is the correct way to create a single instance application?如何檢查WPF應用程序是否已在運行?
我如何檢查我的應用程序已經打開?如果我的應用程序已經運行,我想顯示它而不是打開一個新的實例。
[DllImport("user32.dll")]
private static extern Boolean ShowWindow(IntPtr hWnd, Int32 nCmdShow);
static void Main()
{
Process currentProcess = Process.GetCurrentProcess();
var runningProcess = (from process in Process.GetProcesses()
where
process.Id != currentProcess.Id &&
process.ProcessName.Equals(
currentProcess.ProcessName,
StringComparison.Ordinal)
select process).FirstOrDefault();
if (runningProcess != null)
{
ShowWindow(runningProcess.MainWindowHandle, SW_SHOWMAXIMIZED);
return;
}
}
方法2
static void Main()
{
string procName = Process.GetCurrentProcess().ProcessName;
// get the list of all processes by the "procName"
Process[] processes=Process.GetProcessesByName(procName);
if (processes.Length > 1)
{
MessageBox.Show(procName + " already running");
return;
}
else
{
// Application.Run(...);
}
}
感謝重播,但對我來說還不清楚。我不知道在哪裏使用這段代碼。在主窗口或在app.xaml?如果登錄對話框結果爲true,則主窗口將打開。我甚至不知道如何顯示,最大化打開的應用程序 –
此代碼應該轉到主要方法。在這裏看看有關主要方法的更多信息。 http://joyfulwpf.blogspot.com/2009/05/where-is-main-method-in-my-wpf.html – CharithJ
做到這一點:
using System.Threading;
protected override void OnStartup(StartupEventArgs e)
{
bool result;
Mutex oMutex = new Mutex(true, "Global\\" + "YourAppName",
out result);
if (!result)
{
MessageBox.Show("Already running.", "Startup Warning");
Application.Current.Shutdown();
}
base.OnStartup(e);
}
這不會顯示現有實例的窗口 –
試試這個,我測試了它。 – saber
我剛測試過它。第一次運行應用程序時,表單通常顯示。第二次,你會看到一個對話框「已經運行」,並且當你忽略該對話時什麼也沒有發生。 OP希望在這種情況下顯示應用程序的原始實例。使用你的解決方案,如果我最小化原始實例,或者將記事本放在它的前面,它不會被帶到前臺。 –
public partial class App
{
private const string Guid = "250C5597-BA73-40DF-B2CF-DD644F044834";
static readonly Mutex Mutex = new Mutex(true, "{" + Guid + "}");
public App()
{
if (!Mutex.WaitOne(TimeSpan.Zero, true))
{
//already an instance running
Application.Current.Shutdown();
}
else
{
//no instance running
}
}
}
對我的.NET 4.0 WPF應用程序不起作用? – Darren
下面是一行代碼,它會爲你做這個...
if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1)
{
// Show your error message
}
它是每個計算機,每個用戶還是每個桌面的一個實例嗎? – adrianm