Diskuze: c# form - zakázání vícenásobného spuštění aplikace
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Jedna z možností:
using System;
using System.IO.Pipes;
using System.Windows.Forms;
using System.Threading.Tasks;
namespace JenJednou
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
NamedPipeServerStream server = new NamedPipeServerStream("myPipeServerStream");
Task.Factory.StartNew(() =>
{
while (true)
{
server.WaitForConnection();
server.Disconnect();
}
});
}
catch (Exception)
{
return;
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}
Dalsia moznost:
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace LenRaz
static class Program
{
static Mutex mutex;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
if (!IsAlreadyRunning())
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
else
{
MessageBox.Show("Program je mozne spustit iba raz.", "Varovanie", MessageBoxButtons.OK, MessageBoxIcon.Information);
Application.Exit();
}
}
catch { }
}
private static bool IsAlreadyRunning()
{
string strLoc = System.Reflection.Assembly.GetExecutingAssembly().Location;
FileSystemInfo fileInfo = new FileInfo(strLoc);
string sExeName = fileInfo.Name;
bool bCreatedNew;
mutex = new Mutex(true, "Global\\" + sExeName, out bCreatedNew);
if (bCreatedNew)
mutex.ReleaseMutex();
return !bCreatedNew;
}
}
Díky za kód. Jen jsem tě chtěl poprosit o vysvětlení kódu, moc mu nerozumím a nerad bych bezhlavě kopíroval kód aniž bych nevěděl jak funguje. Díky
Teď nevím, které řešení zvolit
Díky
Ani ti nepovím, takto jsem to kdysi někde našel. A mám to použito v jednom projektu a vím že to funguje.
Podle mě by to mělo stačit i takto:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
try
{
//tady se program pokusí vytvořit 'pojmenovanou komunikační rouru'
//ta se používá ke komunikaci mezi aplikacemi
NamedPipeServerStream server = new NamedPipeServerStream("myPipeServerStream");
//pokud se jí nepodaří vytvořit (většinou proto, že již existuje)
//vyvolá to chybu
}
catch (Exception)
{
return; //tady se Main ukončí (tím se ukončí celá aplikace)
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
vlastně smysl proč je tam StartNew nevidím.
Zobrazeno 6 zpráv z 6.