<label id="omcfq"></label>

      <rp id="omcfq"><acronym id="omcfq"></acronym></rp>


        广州电脑培训暨华官网
        广州电脑培训
        • 广东省软件工程师实训基地
        • 广东省高薪就业培训中心

        • 广东省网络工程师实训基地
        • 广东省电脑人才培训中心

        您现在的位置:所在位置: 广州电脑培训 >> 电脑技术 >> net >> 正文    >

        C# 只启动一个实例完全解决方案
          

          工作上经常会遇到"程序只能启动一个实例"这样的需求. 我想,这样的需求应该很普遍,所以没打算去动脑筋,去找谷歌问下就得了,用下来发现,不是这里不爽就是那里不行.

          先说下我详细的几点需求(假设程序名为"A.exe")

          1.程序只能同时打开一个实例.

          2.在A.exe已经启动的情况下,双击A.exe,则把已经启动的A.exe激活,并呈现到最前.

          3.复制A.exe,命名为B.exe,在A.exe已经启动的情况下,双击B.exe,则把A.exe激活,并呈现到最前.

          好,现在就来看看网络上的解决方案

          1.互斥法

          bool createdNew; Mutex instance

          = new Mutex(true,"互斥名(保证在本机中唯一)", out

          createdNew);

          if

          (createdNew)

          {

          Application.EnableVisualStyles();

          Application.SetCompatibleTextRenderingDefault(false);

          Application.Run(new FormMain());

          instance.ReleaseMutex();

          }

          else

          {

          MessageBox.Show("已经启动了一个程序,请先退出!", "系统提示", MessageBoxButtons.OK,

          MessageBoxIcon.Error);

          Application.Exit();

          }

          评价:

          个人认为这种方法非常的好,能做出判断的准确,即使启动复制的执行文件,依然可以提示"已经启动一个程序,请先退出!".这样,它满足了上述需要中的第一条和第三条的前半部分.但是有一个不足:无法激活已经启动的程序(至少我不知道怎么实现 ,如果有谁知道用互斥可以实现以上三个要求,请留言告诉我,不胜感激!)

          2.Process法

          添加如下函数:

          public static Process RunningInstance()

          {

          Process current = Process.GetCurrentProcess();

          Process[] processes = Process.GetProcessesByName(current.ProcessName);

          //Loop through the running processes in with the same name

          foreach (Process process in processes)

          {

          //Ignore the current process

          if (process.Id != current.Id)

          {

          //Make sure that the process is running from the exe file.

          if (Assembly.GetExecutingAssembly().Location.Replace("/", "\") == current.MainModule.FileName)

          {

          //Return the other process instance.

          return process;

          }

          }

          }

          //No other instance was found, return null.

          return null;

          }

          修改系统Main函数,大致如下:

          if( RunningInstance() == null )

          Application.Run(new yourFormName());

          评价:

          速度比较慢,其次通过ProcessName去系统中查寻,有可能查出来的Process并不是我想要得,不过,稍做修改,便可以很实现需求的第二条(让程序只运行一次,如果程序已经运行,把它弹出并显示到最前面).但是它同样有一个很严重的问题,也就无法满足需求中的第三条,做一个复制,然后修改名字(程序名即为进程名),便可以启动多个实例.

          3.VB法

          不解释,直接看代码

          using

          Microsoft.VisualBasic.ApplicationServices;

          static void Main(string[] args)

          {

          App myApp = new App();

          myApp.Run(args);

          }

          class App : WindowsFormsApplicationBase

          {

          public App()

          {

          // 设置单例模式

          this.IsSingleInstance = true;

          // 设置可用于XP窗口样式

          this.EnableVisualStyles = true;

          // 窗口关闭时的操作

          this.ShutdownStyle = ShutdownMode.AfterMainFormCloses;

          }

          ///

          /// 重写OnCreateMainForm()函数

          ///

          protected override void OnCreateMainForm()

          {

          this.MainForm = new FormMain();

          }

          }

          }

          怎么样,也不是很复杂,代码量很少,轻松实现所有需求.当然,有些朋友还可能还有这样的需求

          程序第二次启动的时候,除了把程序激活前置,还要往程序里传递参数,并做处理.没有问题,这样也可以做到,但是可能稍微复杂一点,在VB法的基础上再做点修改就OK啦

          当我们生成一个exe执行文件时,如果再双击一次时,它会再开一个新的程序,这样子是不合适的。下面有一个办法:

          staticvoid Main(){

          Application.EnableVisualStyles();

          Application.SetCompatibleTextRenderingDefault(false);

          //檢測系統是否有“XXXXX.vshost.exe”這一進程存在,如果已有,則不允許再打開。

          if(System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName).Length > 1)

          {

          MessageBox.Show("已有另一個提醒器在運行!","提示信息");

          }

          else

          {

          Application.Run(new frmTraceMold());

          }

          }




      1. 上一篇电脑技术:
      2. 下一篇电脑技术: 没有了

      3. 幸运时时彩 扎囊县 | 望奎县 | 杨浦区 | 鹿泉市 | 永康市 | 博白县 | 甘孜县 | 如皋市 | 林周县 | 宿松县 | 渝北区 | 南投县 | 前郭尔 | 阿拉善左旗 | 嘉黎县 | 隆安县 | 松溪县 | 铁岭市 | 新源县 | 镇巴县 | 苍梧县 | 怀来县 | 广河县 | 呼和浩特市 | 迭部县 | 武功县 | 和田市 | 普洱 | 永平县 | 武宣县 | 东兰县 | 肇州县 | 大竹县 | 泰州市 | 汝州市 | 磐石市 | 宜阳县 | 普宁市 | 郴州市 | 德格县 | 琼中 | 华安县 | 阿尔山市 | 南召县 | 长乐市 | 施甸县 | 永济市 | 桓台县 | 轮台县 | 阳城县 | 交口县 | 建湖县 | 宣化县 | 屏东县 | 玛曲县 | 汉川市 | 兴城市 | 镇坪县 | 南汇区 | 普宁市 | 鄂温 | 丰宁 | 准格尔旗 | 平原县 | 邵阳市 | 盐亭县 | 都江堰市 | 离岛区 | 华坪县 | 通城县 | 伽师县 | 安阳县 | 英吉沙县 | 龙岩市 | 田阳县 | 福贡县 | 昌宁县 | 灵川县 | 自治县 | 宜宾市 | 松原市 | 那曲县 | 惠安县 | 万宁市 | 彭阳县 | 通州市 | 齐河县 | 沂南县 | 黄石市 | 滨州市 | 大冶市 | 台州市 | 苏州市 | 洛阳市 | 黎川县 | 舞阳县 | 黄陵县 | 兰州市 | 永仁县 | 文山县 |