powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запуск одного экземпляра программы WPF
10 сообщений из 10, страница 1 из 1
Запуск одного экземпляра программы WPF
    #39014556
DomenER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день


Возникла необходимость сделать так чтобы при повторном запуске программы происходило переключение на уже открытый экземпляр. И если он был свёрнут то развернулся обратно.

Погуглив немного нашел пару решений, но они все всего лишь выполняют эту задачу на половину, т.е. просто не запускают 2-й экземпляр и ничего не делают при этом либо показывают сообщение об ошибке.Встречались варианты на определение уже запущенного экземпляра в 200 строк кода... А пользователи же не хотят видеть никаких ошибок - поэтому нужно переключить на уже запущенный экземпляр программы и показать пользователю.

На данный момент сделал только, чтоб 2-й экземпляр не запускался:
http://stackoverflow.com/questions/19147/what-is-the-correct-way-to-create-a-single-instance-application

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Windows;

namespace mytest
{
    /// <summary>
    /// Логика взаимодействия для App.xaml
    /// </summary>
    public partial class App : Application
    {


        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
        public static void Main()
        {
            Mutex _mutexSingleInstance = new Mutex(true, "MonitorMeSingleInstance");
            if (_mutexSingleInstance.WaitOne(TimeSpan.Zero, true))
            {
                try
                {

                    mytest.App app = new mytest.App();
                    app.InitializeComponent();
                    app.Run();
                }
                finally
                {

                    _mutexSingleInstance.ReleaseMutex();
                    _mutexSingleInstance.Close();
                }
            }
            else
            {
                var processes = Process.GetProcessesByName(Assembly.GetEntryAssembly().GetName().Name);
                {
                    if (processes.Length > 1)
                    {
                        foreach (var process in processes)
                        {
                            if (process.Id != Process.GetCurrentProcess().Id)
                            {
                                WindowHelper.SetForegroundWindow(process.MainWindowHandle);
                                
                            }
                        }
                    }
                }

            }

        }
    }
}





Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Interop;
using System.Windows.Threading;

namespace mytest
{
    class WindowHelper
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
    }
}



Здесь я не увидел по поиску такого решения.


У кого какие идеи?

Спасибо!
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014642
DomenER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эм. Слишком тяжёлая задача?
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014655
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DomenER,

Код: c#
1.
2.
3.
            if (WindowState == WindowState.Minimized)
                WindowState = WindowState.Normal;
             Activate();
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014728
DomenER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Данный вариант сработает у в уже запущенном одном приложении. А мы запускаем второй экземпляр и должны переключиться на 1-й и закрыть 2-й.
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014797
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DomenERRoman Mejtes,

Данный вариант сработает у в уже запущенном одном приложении. А мы запускаем второй экземпляр и должны переключиться на 1-й и закрыть 2-й.

http://codereview.stackexchange.com/questions/20871/single-instance-wpf-application

вот в этом примере на сколько я могу видеть сделано открытие окна
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014815
DomenER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё 1 важный момент:

Если сделать this.ShowInTaskbar = false;

то SetForegroundWindow уже не срабатывает. И это одна из главных проблем!
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014820
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DomenERЕщё 1 важный момент:

Если сделать this.ShowInTaskbar = false;

то SetForegroundWindow уже не срабатывает. И это одна из главных проблем!
Вообще мне не очень понятно, нафига вся эта лапка кода, если конструктор мутекса имеет 3 параметр.
bool который возвращает значение, существует ли в системе уже такой Mutex или нет. То есть можно создать Mutex, даже не надо захватывать его, затем проверить значение переменной, профит
Код: c#
1.
2.
bool exist;
var mutex = new Mutex(false, "mutexName", out exist);


?
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39014825
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes,

Вы по ссылке прочитайте вниз, там же написан пример, сделанный на базе уже существующих возможностей WPF, там и активация показана и как создать приложение, чтоб оно было одиночным. Я про это даже в книжках читал :) что в WPF уже всё из коробки есть
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39015002
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно использовать не мьютексы и постинг сообщений в окна, а EventWaitHandle - он сам знает, кого оповестить, и как.
Вот здесь это люди обсуждали: http://forum.ixbt.com/topic.cgi?id=26:41932
Ссылка с примером реализации в конце темы.
...
Рейтинг: 0 / 0
Запуск одного экземпляра программы WPF
    #39016850
DomenER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хороший вариант предложен здесь:
http://blogs.microsoft.co.il/arik/2010/05/28/wpf-single-instance-application/

только с маленькой доработкой процедуры в классе

private static object ActivateFirstInstanceCallback(object arg)
{
// Get command line args to be passed to first instance
IList<string> args = arg as IList<string>;
ActivateFirstInstance(args);

if (Application.Current.MainWindow.IsLoaded) //Проверка на загрузку окна
{
if (Application.Current.MainWindow.WindowState == WindowState.Minimized) //Проверка свёрнуто ли окно
{
Application.Current.MainWindow.WindowState = WindowState.Normal; // разворачиваем
}
Application.Current.MainWindow.Activate(); //активируем окно
}

return null;
}
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Запуск одного экземпляра программы WPF
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]