2011-08-24 183 views

回答

13
[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(...); 
    } 
} 
+1

感謝重播,但對我來說還不清楚。我不知道在哪裏使用這段代碼。在主窗口或在app.xaml?如果登錄對話框結果爲true,則主窗口將打開。我甚至不知道如何顯示,最大化打開的應用程序 –

+1

此代碼應該轉到主要方法。在這裏看看有關主要方法的更多信息。 http://joyfulwpf.blogspot.com/2009/05/where-is-main-method-in-my-wpf.html – CharithJ

-1

做到這一點:

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); 
    } 
+0

這不會顯示現有實例的窗口 –

+0

試試這個,我測試了它。 – saber

+1

我剛測試過它。第一次運行應用程序時,表單通常顯示。第二次,你會看到一個對話框「已經運行」,並且當你忽略該對話時什麼也沒有發生。 OP希望在這種情況下顯示應用程序的原始實例。使用你的解決方案,如果我最小化原始實例,或者將記事本放在它的前面,它不會被帶到前臺。 –

2
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 
      } 
     } 
    } 
+0

對我的.NET 4.0 WPF應用程序不起作用? – Darren

1

下面是一行代碼,它會爲你做這個...

if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) 
{ 
// Show your error message 
} 
相關問題