zoukankan      html  css  js  c++  java
  • 让你的程序只运行一个实例

    当运行的程序是要占用端口的程序,若打开多个实例,则会出现不可以用的情况,原因是程序是要独占的方式使用端口。避免运行多个实例的办法,就是只运行一个实例。通过代码如何控制勒?请看下面:

    /********************************************************************************
        版权所有  : Copyright (C) 2009-2012                                                                  
        文件名称  : InstanceProgram                                                 
        作者名称  :IT面包                              
        邮箱地址  : itbread@hotmail.com                                              
        创建时间  : 2012/7/10 14:56:29                                                   
        网站地址  :http://www.cnblogs.com/ITBread/                                  
     *********************************************************************************/
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Diagnostics;
    using System.Reflection;
    using System.Windows.Forms;
    
    namespace KeyGen {
        public class InstanceProgram {
            #region  日让程序只运行一个实例
            /// <summary>
            /// 要运行的主窗体
            /// </summary>
            /// <param name="fm"></param>
            public static void RunProgram(Form fm) {
    
                Process instance = InstanceProgram.RunningInstance();
                if(instance == null)
                    Application.Run(fm);
                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)
                    {
                        //保证要打开的进程同已经存在的进程来自同一文件路径
                        if(Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                         //返回已经存在的进程
                          return process;
                    }
    
                }
    
                return null;
    
            }
    
    
            public static void HandleRunningInstance(Process instance) {
                ShowWindowAsync(instance.MainWindowHandle, 1);  //调用api函数,正常显示窗口
                SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
    
            }
    
            [DllImport("User32.dll")]
            private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
    
            [DllImport("User32.dll")]
            private static extern bool SetForegroundWindow(System.IntPtr hWnd);
    
            #endregion
    
    
        }
    }

    调用方法就是在Main函数里面将要运行的Form传入给RunProgram方法即可

          [STAThread]
            static void Main() {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                InstanceProgram.RunProgram(new Form1());
    
    
            }
  • 相关阅读:
    Android(java)学习笔记68:使用proguard混淆android代码
    SGU 194 Reactor Cooling
    关于流量有上下界的网络流问题的求解
    关于最小割的求解方法
    HDU 5311 Hidden String
    POJ 3548 Restoring the digits
    POJ 2062 HDU 1528 ZOJ 2223 Card Game Cheater
    ZOJ 1967 POJ 2570 Fiber Network
    HDU 1969 Pie
    HDU 1956 POJ 1637 Sightseeing tour
  • 原文地址:https://www.cnblogs.com/ITBread/p/2584735.html
Copyright © 2011-2022 走看看