2011-08-24 40 views
7

thể trùng lặp:
What is the correct way to create a single instance application?Cách kiểm tra xem ứng dụng WPF có đang chạy không?

Làm thế nào tôi có thể kiểm tra xem ứng dụng của tôi đã được mở? Nếu ứng dụng của tôi đã chạy, tôi muốn hiển thị nó thay vì mở một cá thể mới.

+0

Có một phiên bản trên mỗi máy tính, mỗi người dùng hoặc trên máy tính để bàn không? – adrianm

Trả lời

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; 
    } 
} 

Phương pháp 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

cảm ơn bạn đã chơi lại nhưng tôi không rõ. Tôi không biết nơi để sử dụng mã này. trong cửa sổ chính hoặc trong app.xaml? cửa sổ chính đang mở nếu đăng nhập vào hộp thoại kết quả = true. Tôi không biết làm thế nào để hiển thị, tối đa hóa ứng dụng đã mở –

+1

Mã này phải đi đến phương pháp chính. Nhìn vào đây để biết thêm thông tin về phương pháp chính. http://joyfulwpf.blogspot.com/2009/05/where-is-main-method-in-my-wpf.html – CharithJ

-1

làm điều này:

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

Điều này sẽ không hiển thị cửa sổ của cá thể hiện tại –

+0

Hãy thử điều này, tôi đã thử nghiệm nó. – saber

+1

Tôi vừa thử nghiệm nó. Lần đầu tiên bạn chạy ứng dụng, biểu mẫu hiển thị bình thường. Lần thứ hai, bạn nhận được một hộp thoại nói "Đã chạy" và khi bạn loại bỏ hộp thoại đó thì không có gì xảy ra. OP muốn phiên bản gốc của ứng dụng được hiển thị trong trường hợp đó. Sử dụng giải pháp của bạn, nếu tôi thu nhỏ bản gốc, hoặc đặt notepad ở phía trước nó, nó sẽ không được đưa vào nền trước. –

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

không hoạt động đối với ứng dụng .NET 4.0 WPF của tôi? – Darren

1

Dưới đây là một trong những dòng mã mà sẽ làm việc này cho bạn ...

if (Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length > 1) 
{ 
// Show your error message 
} 
Các vấn đề liên quan