https://blog.youkuaiyun.com/chenhailong118/article/details/84081922
winform 有的时候只能打开一次,下一次不要打开的应用
下面是code
static class ApplicationStart
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
bool ExisFlag = false;
System.Diagnostics.Process currentProccess = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] currentProccessArray = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in currentProccessArray)
{
if (p.ProcessName == currentProccess.ProcessName && p.Id != currentProccess.Id)
{
ExisFlag = true;
}
}
if (ExisFlag)
{
return;
}
else
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ModelFileGenerator.View.×××());
}
}
}
上面是第一种方案
在来看看第二种方案
/// <summary>
/// window form show count
/// </summary>
private const int WS_SHOWNORMAL = 1;
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")]
private static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("kernel32.dll")]
private static extern IntPtr LoadLibrary(string sLibName);
/// <summary>
/// application start
/// </summary>
public static void ApplicationStart()
{
Process instance = RunningInstance();
if (instance == null)
{
System.Windows.Forms.Application.EnableVisualStyles();
System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new ×××());
}
else
{
HandleRunningInstance(instance);
}
}
/// <summary>
/// application repeat start
/// </summary>
public static void ApplicationRepeatStart()
{
Process instance = RunningInstance();
if (instance != null)
{
HandleRunningInstance(instance);
}
}
/// <summary>
/// Running process instance
/// </summary>
/// <returns>the running process</returns>
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
////Loop through the running processes in with the same name
foreach (Process process in processes)
{
////Ignore the current process
if (process.Id != current.Id)
{
////Make sure that the process is running from the exe file.
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
{
////Return the other process instance.
return process;
}
}
}
////No other instance was found, return null.
return null;
}
/// <summary>
/// handle running instance
/// </summary>
/// <param name="instance">the running process</param>
public static void HandleRunningInstance(Process instance)
{
////Make sure the window is not minimized or maximized
ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
////Set the real instance to foreground window
SetForegroundWindow(instance.MainWindowHandle);
}
Main函数
-
public const string APP_NAME = "×××"; -
private static bool isFirstAppInstance = true; -
private static Mutex mutex = new Mutex(true, APP_NAME, out isFirstAppInstance); -
/// <summary> -
/// The main entry point for the application. -
/// </summary> -
[STAThread] -
static void Main() -
{ -
if (isFirstAppInstance) -
{ -
ApplicationManagerUtil.ApplicationStart(); -
} -
else -
{ -
ApplicationManagerUtil.ApplicationRepeatStart(); -
}
本文介绍了两种确保Windows Form应用程序仅能运行一个实例的方法。第一种方法通过检查当前进程名称来判断是否有相同进程正在运行。第二种方法使用了Mutex对象来防止多个实例启动,同时提供了激活已运行实例窗口的功能。
411

被折叠的 条评论
为什么被折叠?



