确保只有一个程序实例运行(C#)之解决方案

本文提供了一种使用C#确保应用程序仅运行一个实例的方法。通过检查当前进程与其他同名进程,该方法能够判断是否已有实例正在运行,并将焦点切换到已存在的实例上。
以下是在网上找到的用C#来解决一个程序只运行一个实例的问题,但我觉得在某些情况下并不适用!

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

public class OneInstnace

    [STAThread]
    public static void Main()
    {
        //Get the running instance.
        Process instance = RunningInstance();
        if (instance == null)
        {
            //There isn't another instance, show our form.
            Application.Run (new Form());
        }
        else
        {
            //There is another instance of this process.
            HandleRunningInstance(instance);
        }
    }
    public 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;
    }


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

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

转载于:https://www.cnblogs.com/Jerryes/archive/2006/02/17/332771.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值