zoukankan      html  css  js  c++  java
  • 单实例运行

    一、

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

    public class OneInstnace
    {

     //Api声明,并声明一

     [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;


     [STAThread]  public static void Main()
     {    
      //得到正在运行的例程    
      Process instance = RunningInstance();    
      if (instance == null)
      {
       //如果没有其它例程,就新建一个窗体      
       Application.Run (new OneInstnace());    
      }    
      else    
      {
       //处理发现的例程
       HandleRunningInstance(instance);
      }
     }
     public static Process RunningInstance()  
     {
      Process current = Process.GetCurrentProcess();
      Process[] processes = Process.GetProcessesByName (current.ProcessName);
      //遍历正在有相同名字运行的例程    
      foreach (Process process in processes)    
      {
       //忽略现有的例程      
       if (process.Id != current.Id) 
       {
        //确保例程从EXE文件运行        
        if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==current.MainModule.FileName)
        {
         //返回另一个例程实例          
         return process;
        }
       }
      }
      //没有其它的例程,返回Null    
      return null;  
     }
     public static void HandleRunningInstance(Process instance)
     {
      //确保窗口没有被最小化或最大化    
      ShowWindowAsync (instance.MainWindowHandle , WS_SHOWNORMAL);   
      //设置真实例程为foreground window    
      SetForegroundWindow (instance.MainWindowHandle);
     }
    }

    二、

            /// <summary>
            /// 单实例运行
            /// </summary>
            /// <returns> true 应用程序已启动,false 则没有 </returns>
            public bool SingleRun(ref System.Threading.Mutex mutex )
            {
                mutex = new System.Threading.Mutex(false, "WINDOWS");
                if (!mutex.WaitOne(0, false))
                {
                    mutex.Close();
                    mutex = null;
                }
                if (mutex == null)
                {
                    return true;
                }
                return false;
            }
    


    返回导读目录,阅读更多随笔



    分割线,以下为博客签名:

    软件臭虫情未了
    • 编码一分钟
    • 测试十年功


    随笔如有错误或不恰当之处、为希望不误导他人,望大侠们给予批评指正。

  • 相关阅读:
    macos linux 命令行显示当前全路径方法
    mac 下面使用apidoc 使用
    du 统计文件夹大小
    mac 共享文件和mount挂载数据
    linux与linux、windows之间文件共享的几种方式
    Yaf安装和配置
    设计模式之 里氏替换原则
    设计模式之单一职责原则
    微信支付 遇到问题总结
    bash shell 快捷键
  • 原文地址:https://www.cnblogs.com/08shiyan/p/2008240.html
Copyright © 2011-2022 走看看