• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > c#防止多次运行代码收集分享

c#防止多次运行代码收集分享

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#源代码下载,c#登录界面代码,c#计算器程序代码,c#计时器代码,c#md5加密代码等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

方法一

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 
      );
  }
</div>

方法二

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());
}
</div>

方法三

原文如下(http://www.weikejianghu.com/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);
  }
</div>

经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美。

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 
      );
  }
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 一则C#简洁瀑布流代码
  • C#调用Java代码的方法介绍
  • c#防止多次运行代码收集分享
  • C#独立域名查询代码

相关文章

  • 2017-05-28C#简单邮件群发通用类
  • 2017-05-28C#中嵌入SQLite数据库的简单方法
  • 2017-05-28学习Winform文本类控件(Label、Button、TextBox)
  • 2017-05-28C#获取本机IP地址(ipv4)
  • 2017-05-28WPF实现图片合成或加水印的方法【2种方法】
  • 2017-05-28C#基础概念二十五问 16-20
  • 2017-05-28C#中前台线程和后台线程的区别与联系
  • 2017-05-28Winform让DataGridView左侧显示图片
  • 2017-05-28浅谈C#各种数组直接的数据复制/转换
  • 2017-05-28C#二进制序列化实例分析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#实现网页截图功能
    • 用C#编写ActiveX控件(三)
    • winform创建不规则窗体的方法
    • C#实现将日志写入文本文件的方法
    • C#中的集合用法分析
    • C#实现线程池的简单示例
    • DevExpress中GridControl列转义的实现方法
    • C#编写DES加密、解密类
    • 在.NET中读取嵌入和使用资源文件的方法
    • c#中的delegate(委托)和event(事件)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有