Архив метки: WPF



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

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

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

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

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