2016-08-08 3 views
0

У меня есть приложение, которому разрешено запускать только один экземпляр на сеанс пользователя. Если пользователь снова запустит приложение, я хочу, чтобы он уже сосредоточился. Я последовал шаги в этом учебнике WPF Single Instance Applicationкак вызвать класс экземпляра из App.xaml.cs

и шаги в этом учебнике:

Шаг 1: Добавьте файл SingleInstance.cs к вашему проекту.

Шаг 2: Добавьте ссылку на свой проект: System.Runtime.Remoting.

Шаг 3: Внесите свой класс приложения ISingleInstanceApp (определенный в SingleInstance.cs).

Единственный метод этого интерфейса:

Скрыть Скопировать код BOOL SignalExternalCommandLineArgs (IList арг) Этот метод вызывается, когда второй экземпляр приложения пытается запустить. Он имеет параметр args, который совпадает с аргументами командной строки, переданными второму экземпляру.

Шаг 4: Определите свою основную функцию, которая использует единственный класс экземпляра. Теперь

Ваш класс App должен быть похож на это:

Скрыть Скопировать код /// Шаг 5: Установите новый основной точкой входа.

Выберите Свойства проекта -> Приложение и установите «Объект запуска» для вашего имени класса приложения вместо «(Не задано)».

Шаг 6: Отмените основную функцию WPF по умолчанию.

Щелкните правой кнопкой мыши по App.xaml, Properties, установите Build Action на «Страница» вместо «Application Definition».

Я придерживаюсь на шаге 4 Я не знаю, как определить мою собственную главную функцию, которая использует единственный класс экземпляра? кто-нибудь мне помочь, пожалуйста, спасибо

+0

взглянуть на [Мой вопрос] (http://stackoverflow.com/questions/38473277/wpf-single-instance-window-clickonce-pass-arguments) и игнорировать параметр-часть – lokusking

ответ

0

Хорошо это так легко добавить этот метод в файл App.xaml.cs в App Класс:

[STAThread]  
public static void Main(string[] args) 
{ 
    if (SingleInstance<App>.InitializeAsFirstInstance("MyApp")) 
    { 
     var app = new App(); 
     app.InitializeComponent(); 
     app.Run(); 
     // Allow single instance code to perform cleanup operations 
     SingleInstance<App>.Cleanup(); 
    } 
} 
+0

GRADApp не принимал и есть красная линия под ним, почему? –

+0

Opps, я забыл изменить его, сообщение было обновлено. –

+0

он стал в синем цвете, но по-прежнему имел красную линию под ним, и ошибка говорит: «Тип MyApp.App нельзя использовать как параметр типа. TApplication - это общий тип или метод Microsoft.Shell.SingleInstance есть нет неявного преобразования ссылок из MyApp.App в Microsoft.Shell.SingleInstanceApp –

-1
using System.Threading; 

[DllImport("user32.dll")] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool SetForegroundWindow(IntPtr hWnd); 

/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
    bool createdNew = true; 
    using (Mutex mutex = new Mutex(true, "MyApplicationName", out createdNew)) 
    { 
     if (createdNew) 
     { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new MainForm()); 
     } 
     else 
     { 
     Process current = Process.GetCurrentProcess(); 
     foreach (Process process in Process.GetProcessesByName(current.ProcessName)) 
     { 
      if (process.Id != current.Id) 
      { 
       SetForegroundWindow(process.MainWindowHandle); 
       break; 
      } 
     } 
     } 
    } 
} 
+0

Application.Run (новый MainWindow()), не принял в моем коде и ошибка = ==> лучший перегруженный метод для System.Windows.Forms.Application.Run (System.Windows.Forms.ApplicationContext имеет те же недопустимые аргументы –

+0

Это решение WinForms. Не очень полезно в WPF – lokusking