2008-09-09 11 views

Odpowiedz

8

Scott Hanselman answers na Twoje pytanie w szczegółach.

4

Oto, co robię obecnie w pliku Program.cs aplikacji.

// Sets the window to be foreground 
[DllImport("User32")] 
private static extern int SetForegroundWindow(IntPtr hwnd); 

// Activate or minimize a window 
[DllImportAttribute("User32.DLL")] 
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
private const int SW_RESTORE = 9; 

static void Main() 
{ 
    try 
    { 
     // If another instance is already running, activate it and exit 
     Process currentProc = Process.GetCurrentProcess(); 
     foreach (Process proc in Process.GetProcessesByName(currentProc.ProcessName)) 
     { 
      if (proc.Id != currentProc.Id) 
      { 
       ShowWindow(proc.MainWindowHandle, SW_RESTORE); 
       SetForegroundWindow(proc.MainWindowHandle); 
       return; // Exit application 
      } 
     } 


     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
    } 
    catch (Exception ex) 
    { 
    } 
} 
0

Aku, to dobry zasób. Odpowiedziałem na pytanie podobne do tego, które pojawił się jakiś czas temu. Możesz sprawdzić moją answer here. Mimo że było to dla WPF, możesz użyć tej samej logiki w WinForm.

+0

Właściwie ja nauczyłem się tej sztuczki od Sells książki też. Ale artykuł Scotta mieści się po prostu wśród moich zakładek :) – aku

3

Można użyć takiego wykrywania i aktywować swoje wystąpienie po nim:

 // Detect existing instances 
     string processName = Process.GetCurrentProcess().ProcessName; 
     Process[] instances = Process.GetProcessesByName(processName); 
     if (instances.Length > 1) 
     { 
      MessageBox.Show("Only one running instance of application is allowed"); 
      Process.GetCurrentProcess().Kill(); 
      return; 
     } 
     // End of detection 
+0

Dzięki, bardzo podoba mi się twoje rozwiązanie. – Sharique

Powiązane problemy