Активация основной формы приложения с одним экземпляром - PullRequest
7 голосов
/ 09 сентября 2008

В приложении Windows Forms на C # я хочу определить, запущен ли другой экземпляр приложения. Если это так, активируйте основную форму запущенного экземпляра и закройте этот экземпляр.

Каков наилучший способ достичь этого?

Ответы [ 4 ]

8 голосов
/ 09 сентября 2008

Скотт Хансельман ответы на ваш вопрос в деталях.

4 голосов
/ 09 сентября 2008

Вот что я сейчас делаю в файле Program.cs приложения.

// 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)
    {
    }
}
3 голосов
/ 29 апреля 2009

Вы можете использовать такое обнаружение и активировать свой экземпляр после него:

        // 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 голосов
/ 09 сентября 2008

Аку, это хороший ресурс. Я ответил на вопрос, похожий на этот, некоторое время назад. Вы можете проверить мой ответ здесь . Хотя это было для WPF, вы можете использовать ту же логику в WinForms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...