-
C#教程之c#防止多次运行代码收集分享
方法一
class Program { [STAThread] static void Main(string[] args) { //防止程序多次运行 if (!OneInstance.IsFirst("MyTest")) { Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!"); return; } Console.WriteLine("正在运行中"); Console.ReadLine(); } } public static class OneInstance { ///<summary> ///判断程序是否正在运行 ///</summary> ///<param name="appId">程序名称</param> ///<returns>如果程序是第一次运行返回True,否则返回False</returns> public static bool IsFirst(string appId) { bool ret = false; if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero) { CreateMutex(IntPtr.Zero, 0, appId); ret = true; } return ret; } [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] private static extern IntPtr OpenMutex( uint dwDesiredAccess, // access int bInheritHandle, // inheritance option string lpName // object name ); [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] private static extern IntPtr CreateMutex( IntPtr lpMutexAttributes, // SD int bInitialOwner, // initial owner string lpName // object name ); }
方法二
string MnName = Process.GetCurrentProcess().MainModule.ModuleName; //返回不具有扩展名的制定路径字符串的文件名 String Pname = Path.GetFileNameWithoutExtension(MnName); Process[] myprocess = Process.GetProcessesByName(Pname); if (myprocess.Length > 1) { MessageBox.Show("yici", "tishi", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { //Application.EnableVisualStyles(); ////Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); }
方法三
原文如下(http://www.jb51.net/article/41179.htm)
经常我们会有这样的需求,只让应用程序运行一个实体。通常我们的情况是,双击一个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); }
经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美。
class Program { [STAThread] static void Main(string[] args) { //防止程序多次运行 if (!OneInstance.IsFirst("MyTest")) { Console.WriteLine("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!"); return; } Console.WriteLine("正在运行中"); Console.ReadLine(); } } public static class OneInstance { ///<summary> ///判断程序是否正在运行 ///</summary> ///<param name="appId">程序名称</param> ///<returns>如果程序是第一次运行返回True,否则返回False</returns> public static bool IsFirst(string appId) { bool ret = false; if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero) { CreateMutex(IntPtr.Zero, 0, appId); ret = true; } return ret; } [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] private static extern IntPtr OpenMutex( uint dwDesiredAccess, // access int bInheritHandle, // inheritance option string lpName // object name ); [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] private static extern IntPtr CreateMutex( IntPtr lpMutexAttributes, // SD int bInitialOwner, // initial owner string lpName // object name ); }
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式