WPF: Запускать только одну копию приложения

Оригинал инструкции здесь.

0. Создаём новый WPF-проект, называем его, к примеру, «SingleInstanceApp».
1. Добавляем в проект необходимую сборку (Reference):
Solution ExplorerReferencesAdd Reference…System.Runtime.Remoting

В новых версиях Visual Studio этот пункт был перенесён:.
DependenciesAdd COM Reference…

 

2. Добавляем в проект класс SingleInstance:
Solution ExplorerSingleInstanceAppAddExisting Item…SingleInstance.cs

Этот класс позволяет провести проверку и убедиться, что только один экземпляр программы запущен в данный момент времени.

3. В дереве Solution Explorer открываем файл App.xaml.cs.
4. В самое начало файла добавляем строку

using Microsoft.Shell;

5. Прописываем для класса App необходимый интерфейс (просто добавляем ISingleInstanceApp), чтобы получилось так:

public partial class App : Application, ISingleInstanceApp

6. Теперь нужно изменить «Стартовый объект»
Solution ExplorerSingleInstanceAppPropertiesApplicationStartup objectSingleInstanceApp.App:
WPF: Запускать только одну копию приложения
7. Создаём уникальную строку

Для этого я использовал утилиту из PowerShell guid.

8. Присваиваем строку из п.7. переменной Unique, т.о. полный код файла App.xaml.cs становится такой:

using Microsoft.Shell;
using System;
using System.Collections.Generic;
using System.Windows;

namespace SingleInstanceApp
{
  /// <summary>
  /// Interaction logic for App.xaml
  /// </summary>
  public partial class App : Application, ISingleInstanceApp
  {
    // TODO: Make this unique!
    private const string Unique = "9d14cbf3-dfaa-450c-a6fe-ac9f797bac6c";

    [STAThread]
    public static void Main()
    {
      if (SingleInstance.InitializeAsFirstInstance(Unique))
      {
        var application = new App();
        application.InitializeComponent();
        application.Run();

        // Allow single instance code to perform cleanup operations
        SingleInstance.Cleanup();
      }
    }

    #region ISingleInstanceApp Members
    public bool SignalExternalCommandLineArgs(IList<string> args)
    {
      // Handle command line arguments of second instance
      // ...
      // Bring window to foreground
      if (this.MainWindow.WindowState == WindowState.Minimized)
      {
        this.MainWindow.WindowState = WindowState.Normal;
      }
      App.Current.MainWindow.Show();
      this.MainWindow.Activate();

      return true;
    }
    #endregion
  }
}

Окончательный вариант кода, восстанавливает свёрнутое окно (метод SignalExternalCommandLineArgs)

9. В Solution Explorer на файле App.xaml открываем Properties и выставляем Build Action = Page.
10. Нажимаем BuildBuild Solution

Если попытаться запустить другой экземпляр программы, то будет открыт тот, что уже запущен. Если он был свёрнут, то окно будет восстановлено.



Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *