廣州暨華電腦學校
咨詢熱線:020-85566216

誠        毅        精      勤

當前位置:所在位置: 廣州電腦培訓 >> 電腦技術 >> net >> 正文

C# 只啟動一個實例完全解決方案

發布時間:2018/2/28 17:59:04 內容來源::廣州暨華電腦學校 點擊:

  工作上經常會遇到"程序只能啟動一個實例"這樣的需求. 我想,這樣的需求應該很普遍,所以沒打算去動腦筋,去找谷歌問下就得了,用下來發現,不是這里不爽就是那里不行.

  先說下我詳細的幾點需求(假設程序名為"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());

  }

  }

  • 上一篇電腦技術:
  • 下一篇電腦技術: 沒有了
  • 學校簡介 |專業課程 | 學生就業 | 參觀學校

    學校地址:廣州天河區五山路金華園區C座3樓307(華南理工大學南門旁)

    學校名稱:廣州暨華電腦培訓學校 聯系電話:020-85566215

    2002-2019 廣州青大教育信息咨詢有限公司 版權所有 備案/許可證編號為:粵ICP備11083420號-11

    今天30选5开奖公告