手机
当前位置:查字典教程网 >编程开发 >C#教程 >C# 禁止应用程序多次启动的实例
C# 禁止应用程序多次启动的实例
摘要:通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一...

通常我们的情况是,双击一个exe文件,就运行一个程序的实体,再双击一次这个exe文件,又运行这个应用程序的另一个实体。就拿QQ游戏来说吧,一台电脑上一般只能运行一个QQ游戏大厅(不过以前听说过有双开的外挂)。

那我们的程序也能像QQ游戏那里禁止多次启动吗,答案是可以的,下面介绍下一个简单的实现方法,那就是Mutex(互斥)。

Mutex(mutual exclusion,互斥)是.Net Framework中提供跨多个线程同步访问的一个类。它非常类似了Monitor类,因为他们都只有一个线程能拥有锁定。而操作系统能够识别有名称的互斥,我们可以给互斥一个唯一的名称,在程序启动之前加一个这样的互斥。这样每次程序启动之前,都会检查这个命名的互斥是否存在。如果存在,应用程序就退出。

复制代码 代码如下:

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

bool createdNew;

//系统能够识别有名称的互斥,因此可以使用它禁止应用程序启动两次

//第二个参数可以设置为产品的名称:Application.ProductName

//每次启动应用程序,都会验证名称为SingletonWinAppMutex的互斥是否存在

Mutex mutex = new Mutex(false, "SingletonWinAppMutex", out createdNew);

//如果已运行,则在前端显示

//createdNew == false,说明程序已运行

if (!createdNew)

{

Process instance = GetExistProcess();

if (instance != null)

{

SetForegroud(instance);

Application.Exit();

return;

}

}

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new MainForm());

}

/// <summary>

/// 查看程序是否已经运行

/// </summary>

/// <returns></returns>

private static Process GetExistProcess()

{

Process currentProcess = Process.GetCurrentProcess();

foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))

{

if ((process.Id != currentProcess.Id) &&

(Assembly.GetExecutingAssembly().Location == currentProcess.MainModule.FileName))

{

return process;

}

}

return null;

}

/// <summary>

/// 使程序前端显示

/// </summary>

/// <param name="instance"></param>

private static void SetForegroud(Process instance)

{

IntPtr mainFormHandle = instance.MainWindowHandle;

if (mainFormHandle != IntPtr.Zero)

{

ShowWindowAsync(mainFormHandle, 1);

SetForegroundWindow(mainFormHandle);

}

}

[DllImport("User32.dll")]

private static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("User32.dll")]

private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

}

【C# 禁止应用程序多次启动的实例】相关文章:

C# Winform 禁止用户调整ListView的列宽

C# 图片剪切与缩小的实例

C#缩略图多路径多格式保存的实例

C# 手动/自动保存图片的实例代码

C#中常使用进度条的代码

C#访问应用程序配置文件的方法

C# WinForm程序完全退出的问题解决

C#生成随机字符串的实例

C#生成影像金字塔的原理实例

C#中调用命令行cmd开启wifi热点的实例代码

精品推荐
分类导航