逍遥游

一直在想,怎样路好走一点,一直想,一直在崎岖中徘徊。
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

禁止程序重复运行限制

Posted on 2005-09-27 15:25  逍遥游  阅读(386)  评论(0)    收藏  举报

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;

namespace ArLi.CommonPrj
{
 public class one_instance_Check
 {
  public one_instance_Check()
  {
  }

  #region how use this?
  /*  
   using ArLi.CommonPrj;
   
   if (one_instance_Check.goCheck("Process Exist !")) {
    Application.Run (new Form1());
   }
  */
  #endregion

  [DllImport("User32.dll")]
  private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
  [DllImport("User32.dll")]
  private static extern bool SetForegroundWindow(IntPtr hWnd);
  
  private const int WS_SHOWNORMAL = 1;

  public static bool GoCheck(string waringMessage_ifExist) {
   Process instance = RunningInstance();
   if (instance == null) {
    return true;
   }
   else {
    if (waringMessage_ifExist != null) {
     
     System.Windows.Forms.MessageBox.Show(
      null,
      waringMessage_ifExist,
      System.Windows.Forms.Application.ProductName.ToString(),
      System.Windows.Forms.MessageBoxButtons.OK,
      System.Windows.Forms.MessageBoxIcon.Exclamation
     );

    }
    HandleRunningInstance(instance);
    return false;
   }
  }

  private 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;
  }


  private static void HandleRunningInstance(Process instance) {
   //Make sure the window is not minimized or maximized
   ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);

   //Set the real intance to foreground window
   SetForegroundWindow (instance.MainWindowHandle);
  }
 }
}