今次介绍一个应用程序单例唯一运行方案的代码。
我们知道,有些应用程序在操作系统中需要单例唯一运行,因为程序多开的话会对程序运行效果有影响,最基本的例子就是打印机,只能运行一个实例。这里将笔者单例运行的代码共享出来,需要的读者请自己复用该代码到自己的项目中即可。
1、 项目目录;
下面是项目目录,因为是一段代码,所以给出的例子比较简单。
2、 代码介绍;
这里的代码挺简单的,就是获取应用程序的GUID和运行的进程进行判断,因为GUID唯一,所以更改了程序名称或者改变了目录都不会有影响;而运行进程判断是附加的方式,防止当前目录的程序运行多次。
1 namespace ProgramInstance 2 { 3 using System; 4 using System.Diagnostics; 5 using System.Reflection; 6 using System.Runtime.InteropServices; 7 using System.Threading; 8 9 10 /// <summary> 11 /// 单例程序操作类 12 /// </summary> 13 internal class SingleInstance 14 { 15 /// <summary> 16 /// 程序是否运行 17 /// </summary> 18 /// <returns>true 程序已运行;false 程序未运行</returns> 19 internal static bool IsRunning(out Process process) 20 { 21 //如果判断全系统唯一,直接用下列方法;如果判断当前文件夹唯一,则将GUID判断去掉; 22 new Mutex(true,
new Guid(((GuidAttribute)Attribute.GetCustomAttribute(Assembly.GetExecutingAssembly(),
typeof(GuidAttribute))).Value).ToString("N"),
out bool createdNew); 23 process = RunningInstance(); 24 return (!createdNew || (process != null)); 25 } 26 /// <summary> 27 /// 获取当前程序进程实例 28 /// </summary> 29 /// <returns>程序进程实例</returns> 30 private static Process RunningInstance() 31 { 32 Process currentProcess = Process.GetCurrentProcess(); 33 foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName)) 34 { 35 if ((process.Id != currentProcess.Id) &&
(Assembly.GetExecutingAssembly().Location.Replace("/", @"\") == currentProcess.MainModule.FileName)) 36 { 37 return process; 38 } 39 } 40 return null; 41 } 42 } 43 }
1 namespace SingleInstance 2 { 3 using System; 4 using System.Diagnostics; 5 using System.Runtime.InteropServices; 6 using System.Windows.Forms; 7 8 /// <summary> 9 /// 程序类 10 /// </summary> 11 internal static class Program 12 { 13 [DllImport("User32.dll")] 14 private static extern bool SetForegroundWindow(IntPtr hWnd); 15 [DllImport("User32.dll")] 16 private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow); 17 18 /// <summary> 19 /// 应用程序的主入口点 20 /// </summary> 21 [STAThread] 22 static void Main() 23 { 24 if (ProgramInstance.SingleInstance.IsRunning(out Process process)) 25 { 26 ShowWindowAsync(process.MainWindowHandle, 9 | 1); 27 SetForegroundWindow(process.MainWindowHandle); 28 29 return; 30 } 31 32 33 Application.EnableVisualStyles(); 34 Application.SetCompatibleTextRenderingDefault(false); 35 36 Application.Run(new Form1()); 37 } 38 } 39 }
3、 运行截图;
因为是代码段复用,所以这里不提供运行截图了。
4、 源码下载;
需要该例子代码的,请移步到下面链接进行下载:
https://download.csdn.net/download/lzhdim/88158095
上面介绍了C#编写的应用程序单例运行的例子,希望对有该需求的读者以帮助。后面会将笔者认为有用的代码段共享出来,让需要的读者进行代码段复用。
注:如果需要应用程序多开(放到其它文件夹中,或者在当前文件夹中复制更改应用程序名称),请将GUID的判断去掉即可。
Austin Liu 刘恒辉
Project Manager and Software Designer E-Mail:lzhdim@163.com Blog:https://lzhdim.cnblogs.com 欢迎收藏和转载此博客中的博文,但是请注明出处,给笔者一个与大家交流的空间。谢谢大家。 |