Синхронизация приложений на WF 2.0
От: vovkas  
Дата: 04.01.11 13:31
Оценка:
Доброе время суток.

Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран.
Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re: Синхронизация приложений на WF 2.0
От: rasp_file Украина  
Дата: 04.01.11 13:38
Оценка:
Здравствуйте, vovkas, Вы писали:

V>Доброе время суток.


V>Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран.

V>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)

Как вариант, вызвать API функцию FindWindow или же использовать Process.GetProcessesByName и Process.MainWindowHandle.
... << RSDN@Home 1.2.0 alpha 4 rev. 1481>>
Re: Синхронизация приложений на WF 2.0
От: skodnik  
Дата: 04.01.11 14:25
Оценка:
Здравствуйте, vovkas, Вы писали:
Необходимо использовать стандартные механизмы:
http://www.codeproject.com/KB/cs/CSSIApp.aspx
http://openwinforms.com/single_instance_application.html

дополнительно гуглить по фразе:
single instance application .NET
Re: Синхронизация приложений на WF 2.0
От: Jolly Roger  
Дата: 04.01.11 14:38
Оценка: +1
Здравствуйте, vovkas, Вы писали:

V>Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран.


Только развернуться? Никаких данных передавать не надо? Тогда семафор, примерно так (сделано на скорую руку)

using System;
using System.Threading;
using System.Windows.Forms;

namespace SingleProcess
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>

        static EventWaitHandle stopEvent;
        static Form mainForm;
        static Thread waitThread;

        [STAThread]
        static void Main()
        {
            if (!CheckFirstInstance()) return;
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            mainForm = new Form1();
            Application.Run(mainForm);
            stopEvent.Set();
            waitThread.Join();
        }

        static bool CheckFirstInstance()
        {
            bool CreatedNew = false;
            var smf = new Semaphore(0, 1,
                "EB5747ED-E57F-41be-A52F-1963AD9606F5",
                out CreatedNew);
            if (CreatedNew)
            {
                stopEvent = new EventWaitHandle(false, EventResetMode.AutoReset);
                waitThread = new Thread(() =>
                    {
                        var waithandles = new WaitHandle[2]{stopEvent, smf};
                        for (; ; )
                        {
                            var k = WaitHandle.WaitAny(waithandles);
                            if (k == 0) break;
                            mainForm.Invoke(new Action(()=>
                                { mainForm.WindowState = FormWindowState.Maximized; }));
                        }
                        smf.Close();
                        stopEvent.Close();
                    });
                waitThread.Start();
            }
            else 
                smf.Release(1);
            return CreatedNew;
        }
    }
}
"Нормальные герои всегда идут в обход!"
Re[2]: Синхронизация приложений на WF 2.0
От: vovkas  
Дата: 04.01.11 15:22
Оценка:
Здравствуйте, skodnik.

Благодарю. Помогло.
Re: Синхронизация приложений на WF 2.0
От: _FRED_ Черногория
Дата: 04.01.11 17:50
Оценка:
Здравствуйте, vovkas, Вы писали:

V>Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран.

V>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)

здесь
Автор: _FRED_
Дата: 25.05.07
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Синхронизация приложений на WF 2.0
От: Lloyd Россия  
Дата: 04.01.11 17:58
Оценка:
Здравствуйте, _FRED_, Вы писали:

V>>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)


_FR>здесь
Автор: _FRED_
Дата: 25.05.07


Кстати, там тебе задавали вопросы.
Re[3]: Синхронизация приложений на WF 2.0
От: _FRED_ Черногория
Дата: 04.01.11 20:35
Оценка:
Здравствуйте, Lloyd, Вы писали:

V>>>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)

_FR>>здесь
Автор: _FRED_
Дата: 25.05.07

L>Кстати, там тебе задавали вопросы.

Речь не про "Microsoft.VisualBasic.ApplicationServices со свойством IsSingleInstance"?

ИМХО, вопросы Романа как бы ответа не требовали — на счёт мьютекса я просто не понял (или Роман не совсем понял мой пример, ибо эвент я не просто создаю и проверяю, но и жду на нём), а по поводу определения того, что есть "повторный запуск", так ссылка даже дана была, в которой дан простой ответ Если прочитать, что в приведённой статье написано, то передалать мой пример на более универсальный труда не составит.

В "класическом" решении, приведённом в начале статьи
Автор(ы): Dr. Joseph M. Newcomer
Дата: 17.02.2001

В статье подробно рассматриваются различные способы ограничения числа запущенных копий приложения одной. Указываются недостатки и даже ошибки во многих известных методах решения задачи, которые постоянно фигурируют в конференциях и в Сети. Кроме того, указывает на различные трактовки понятия "одна копия приложения" и демонстрирует правильное решение для каждого из случаев.
мне не нравится процесс перебора окон. Отчасти для того, чтобы показать, что это не обязательно, я свой пример и показал.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.