Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран.
Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)
Здравствуйте, vovkas, Вы писали:
V>Доброе время суток.
V>Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран. V>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)
Как вариант, вызвать API функцию FindWindow или же использовать Process.GetProcessesByName и Process.MainWindowHandle.
Здравствуйте, 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;
}
}
}
Здравствуйте, vovkas, Вы писали:
V>Есть приложение на Win Framework 2.0. Необходимо чтоб в системе было всегда одна копия приложения (вероятно тут нужно пользовать Mutex), при попытке запустить вторую копию приложение первая копия должна развернуться на весь экран. V>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)
Здравствуйте, _FRED_, Вы писали:
V>>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться)
_FR>здесь
Здравствуйте, Lloyd, Вы писали:
V>>>Подскажите как это реализовать? (на сколько я понял тут 2я копия должна сообщать 1й — мол разварачивайся и закрыться) _FR>>здесь
Речь не про "Microsoft.VisualBasic.ApplicationServices со свойством IsSingleInstance"?
ИМХО, вопросы Романа как бы ответа не требовали — на счёт мьютекса я просто не понял (или Роман не совсем понял мой пример, ибо эвент я не просто создаю и проверяю, но и жду на нём), а по поводу определения того, что есть "повторный запуск", так ссылка даже дана была, в которой дан простой ответ Если прочитать, что в приведённой статье написано, то передалать мой пример на более универсальный труда не составит.
В "класическом" решении, приведённом в начале статьи