• [转]C#单实例运行,二次激活


    方法一:(注意,该方法在Vista下会询问权限)

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

    方法二:(注意该方法经过MaxToCode会失效)

    private static void CheckRunOneInstance()
      {
       bool createdNew = false;
       Mutex mutex = new Mutex(true, "{4208A52F-3D84-40ca-B4DD-0D8AE4B4D390}", out createdNew);
       if (createdNew)
       {    
        Application.Run(new FMain());
       }
       else
       {
        IntPtr app=FindWindow(null,"DecTool");
        if(app!=System.IntPtr.Zero)
        {
         SetForegroundWindow(app);
        }

        System.Environment.Exit(0);
       }
      }

  • 相关阅读:
    flash中网页跳转总结
    as3自定义事件
    mouseChildren启示
    flash拖动条移出flash无法拖动
    需要一个策略文件,但在加载此媒体时未设置checkPolicyFile标志
    Teach Yourself SQL in 10 Minutes
    电子书本地转换软件 Calibre
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes
    Teach Yourself SQL in 10 Minutes – Page 31 练习
  • 原文地址:https://www.cnblogs.com/llcto/p/1605518.html
Copyright © 2020-2023  润新知