c#防止多次运行代码收集分享
作者:shangke 时间:2021-09-27 18:28:26
方法一
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());
}
方法三
原文如下(https://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
);
}
标签:c#,防止,多次运行
0
投稿
猜你喜欢
详解MyBatis XML配置解析
2023-11-23 13:02:09
在Java内存模型中测试并发程序代码
2023-11-24 20:37:55
聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的
2023-11-16 08:55:50
FeignClient如何脱离eureka自定义URL
2022-08-27 01:37:25
java8从list集合中取出某一属性的值的集合案例
2023-04-30 01:51:49
关于bootstrap.yml和bootstrap.properties的优先级问题
2021-10-04 11:50:30
亲自教你实现栈及C#中Stack源码分析
2021-05-23 19:39:10
深入学习java位运算的基础知识
2021-06-01 07:10:40
IntelliJ IDEA(2020.2)的下载、安装步骤详细教程
2023-11-25 07:10:16
C# 中的IComparable和IComparer的使用及区别
2023-04-19 20:11:55
JDK动态代理原理:只能代理接口,不能代理类问题
2023-06-16 03:18:40
关于通过java调用datax,返回任务执行的方法
2023-11-28 21:26:45
解决java读取EXCEL数据变成科学计数法的问题
2023-06-14 02:17:56
Hadoop+HBase+ZooKeeper分布式集群环境搭建步骤
2022-02-13 01:16:33
Java Druid连接池与Apache的DBUtils使用教程
2021-07-29 13:21:44
c#使用正则表达式匹配字符串验证URL示例
2023-01-01 10:40:10
Java--Socket通信(客户端服务端双向)
2021-09-21 20:58:37
各种格式的编码解码工具类分享(hex解码 base64编码)
2021-11-17 07:04:51
Ajax登录验证实现代码
2022-02-22 10:47:51
Spring钩子接口汇总分析使用示例
2022-09-24 23:29:56