C#单进程解决方案

一、使用用互斥量(System.Threading.Mutex)

  同步基元,它只向一个线程授予对共享资源的独占访问权。在程序启动时候,请求一个互斥体,如果能获取对指定互斥的访问权,就职运行一个实例。

  代码

  bool createNew;

  using (System.Threading.Mutex mutex =new System.Threading.Mutex(true, Application.ProductName, out createNew))

  {

  if (createNew)

  {

  Application.Run(new Form1());

  }

  else

  {

  MessageBox.Show("应用程序已经在运行中...")

  System.Threading.Thread.Sleep(1000);

  System.Environment.Exit(1);

  }

  }

  二、使用进程名

  代码

  Process[] processes = System.Diagnostics.Process.GetProcessesByName(Appl ication.CompanyName);

  if (processes.Length >1)

  {

  MessageBox.Show("应用程序已经在运行中。。");

  Thread.Sleep(1000);

  System.Environment.Exit(1);

  }

  else

  {

  Application.Run(new Form1());

  }

  三、调用Win32 API,并激活并程序的窗口,显示在最前端

  代码

  /// 该函数设置由不同线程产生的窗口的显示状态

  ///

  ///窗口句柄

  ///指定窗口如何显示。查看允许值列表,请查阅ShowWlndow函数的说明部分

  /// 如果函数原来可见,返回值为非零;如果函数原来被隐藏,返回值为零

  [DllImport("User32.dll")]

  privatestaticexternbool ShowWindowAsync(IntPtr hWnd, int cmdShow);

  ///

  /// 该函数将创建指定窗口的线程设置到前台,并且激活该窗口。键盘输入转向该窗口,并为用户改各种可视的记号。

  /// 系统给创建前台窗口的线程分配的权限稍高于其他线程。

  ///

  ///将被激活并被调入前台的窗口句柄

  /// 如果窗口设入了前台,返回值为非零;如果窗口未被设入前台,返回值为零

  [DllImport("User32.dll")]

  privatestaticexternbool SetForegroundWindow(IntPtr hWnd);

  代码

  privateconstint SW_SHOWNOMAL =1;

  privatestaticvoid HandleRunningInstance(Process instance)

  {

  ShowWindowAsync(instance.MainWindowHandle, SW_SHOWNOMAL);//显示

  SetForegroundWindow(instance.MainWindowHandle);//当到最前端

  }

  privatestatic Process RuningInstance()

  {

  Process currentProcess = Process.GetCurrentProcess();

  Process[] Processes = Process.GetProcessesByName(currentProcess.ProcessN ame);

  foreach (Process process in Processes)

  {

  if (process.Id != currentProcess.Id)

  {

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

  {

  return process;

  }

  }

  }

  returnnull;

  }

  代码

  Process process = RuningInstance();

  if (process ==null)

  {

  Application.Run(new Form1());

  }

  else

  {

  MessageBox.Show("应用程序已经在运行中。。。");

  HandleRunningInstance(process);

  //System.Threading.Thread.Sleep(1000);

  //System.Environment.Exit(1);

  }

  转自http://hi.baidu.com/wth123/blog/item/86a3f50ceeb754e937d1226c.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值