C#实现单实例运行

简介: C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 Mutex 的方式是较好的选择。

C#实现单实例运行的方法,也有多种,比如利用 Process 查找进程的方式,利用 API findwindow 查找窗体的方式,还有就是 利用 Mutex 原子操作,上面几种方法中, 综合考虑利用 Mutex 的方式是较好的选择。

[STAThread]
static void Main()
{
    bool isAppRunning = false;
    System.Threading.Mutex mutex = new System.Threading.Mutex(
        true,
        System.Diagnostics.Process.GetCurrentProcess().ProcessName,
        out isAppRunning);
    if (!isAppRunning)
    {
        MessageBox.Show("本程序已经在运行了,请不要重复运行!");
        Environment.Exit(1);
    }
    else
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}
 
使用Process 查找进程的方式会报错:System.ComponentModel.Win32Exception 中第一次偶然出现的“System.dll”类型的异常
原因可能是因为:
有些进程,如:system 系统空闲进程,当前程序没有权限获取相关信息或有些程序没有process.MainModule.FileName这些属性
示例代码:

           bool result = false;
            try
            {
                Process me = Process.GetCurrentProcess();
                Process[] us = Process.GetProcesses();
                Process another = null;
                foreach (var p in us)
                {
                    try
                    {
                        if (p.Id != me.Id && p.MainModule.FileName == me.MainModule.FileName)
                        {
                            another = p;
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.Error(ex);
                    }
                }
                if (another != null)
                {
                    MessageBox.Show("程序已运行", "系统提示", MessageBoxButtons.OK, MessageBoxIcon.Question);
                    result = true;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.StackTrace+“\n”+ e.Message);
                result = true;
            }
            return result;
 
 
 
 
http://xxinside.blogbus.com/logs/47162540.html
相关文章
|
缓存 C#
C# 操作路径(Path)类方法的使用与解析运行实例
C# 操作路径(Path)类方法的使用与解析运行实例
|
11天前
|
Linux C# iOS开发
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
开源GTKSystem.Windows.Forms框架让C# Winform支持跨平台运行
45 12
|
5月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
|
编译器 应用服务中间件 数据库连接
解决C#运行程序修改数据后数据表不做更新的问题
解决C#运行程序修改数据后数据表不做更新的问题
152 0
|
XML 存储 测试技术
在C#下运行Python:IronPython和Pythonnet
在C#下运行Python可能有不同的原因。其中一些原因包括: 1. 使用C#应用程序中不可用的特定Python功能或库。 2. 结合Python的简单性和表现力以及C#的性能和稳健性,完成不同任务。 3. 与基于Python的系统或服务进行集成。
232 0
|
C#
C# 判断当前控制台程序是否重复运行
C# 判断当前控制台程序是否重复运行
180 0
|
C# C++ Windows
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置
395 0
C#工程中输出类型转换以及程序运行后控制台窗口不退出设置
|
C#
C# 实现单实例程序
原文:C# 实现单实例程序 在我们经常使用的软件中,当我们已经打开后,再次打开时,有的软件不会出现两个。例如有道词典,会将上次的界面显示出来,或者提示我们“该程序已经运行...”。我通过一个简单的C# WPF例子来说明。
1109 0
|
C# 数据安全/隐私保护 Windows
C# Windows服务以指定用户运行
参考一下 https://bbs.csdn.net/topics/330151879 服务程序以Local System安装运行没问题,但用这个账户运行的服务无法访问局域网共享资源,比较麻烦,所以想指定用某个账户来启动服务。
2284 0