C#限制程序只能运行一個实例 (防多开)


//方法一:只禁止多个进程运行

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace DuoYeMianIE
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            bool ret;
            System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out ret);
            if (ret)
            {
                System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格
                System.Windows.Forms.Application.DoEvents();             //这两行实现   XP   可视风格
                System.Windows.Forms.Application.Run(new LamBrowser());
                //   Main   为你程序的主窗体,如果是控制台程序不用这句
                mutex.ReleaseMutex();
            }
            else
            {
                MessageBox.Show(null, "有一个和本程序相同的应用程序已经在运行,请不要同时运行多个本程序。\n\n这个程序即将退出。", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                //   提示信息,可以删除。
                Application.Exit();//退出程序
            }
        }
    }
}
//方法二:禁止多个进程运行,并当重复运行时激活以前的进程

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

namespace DuoYeMianIE
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
{
    //Get   the   running   instance.
    Process instance = RunningInstance();
    if (instance == null)
    { System.Windows.Forms.Application.EnableVisualStyles();   //这两行实现   XP   可视风格
        System.Windows.Forms.Application.DoEvents();
        //There   isn‘t   another   instance,   show   our   form.
        System.Windows.Forms.Application.Run(new LamBrowser());
    }
    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;
    }
}

C#限制程序只能运行一個实例 (防多开),布布扣,bubuko.com

时间: 2024-11-18 08:44:33

C#限制程序只能运行一個实例 (防多开)的相关文章

WinForm限制客户程序只能运行一个实例

WinForm限制客户程序只能运行一个实例: using System; using System.Threading; static void Main() { bool create = false; using (Mutex mu = new Mutex(true, Application.ProductName, out create)) { if (create) { Application.Run( new MainForm() ); } else { MessageBox.Show

同一个PC只能运行一个应用实例(考虑多个用户会话情况)

原文:同一个PC只能运行一个应用实例(考虑多个用户会话情况) 1 class Program 2 { 3 private static Mutex m; 4 5 [STAThread] 6 static void Main() 7 { 8 bool createNew = false; 9 10 /* 11 * 在运行终端服务的服务器上,已命名的系统 mutex 可以具有两级可见性. 12 * 如果名称以前缀“Global\”开头,则 mutex 在所有终端服务器会话中均为可见. 13 * 如果

.net利用程序集的GUID解决程序只能运行一次的问题

可以解决同名的程序集(但非同一程序集)只能运行一次的问题,网上很资料都是只检测程序是否同名,不能真正的保证是同一程序集. private bool prevInstance() { Process[] myProcesses= Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName); if (myProcesses.Length > 1) { GuidAttribute curGuid = (GuidAttribut

让程序只运行一个实例

Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要做出一些限制,让程序只能够运行一个实例.在Delphi编程中,笔者总结出了以下几种方法: 一. 查找窗口法 这是最为简单的一种方法.在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在一个实例.在项目源文件的初始化部分添加以下代码: Program On

让程序只运行一个实例(Delphi篇)(三种方法,其中使用全局原子的方法比较有意思)

Windows 下一个典型的特征就是多任务,我们可以同时打开多个窗口进行操作,也可以同时运行程序的多个实例,比如可以打开许多个资源管理器进行文件的移动复制操作.但有时出于某种考虑(比如安全性),我们要做出一些限制,让程序只能够运行一个实例.在Delphi编程中,笔者总结出了以下几种方法: 一. 查找窗口法 这是最为简单的一种方法.在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在一个实例.在项目源文件的初始化部分添加以下代码: [delphi] v

C#让应用程序只运行一个实例的几种方法

一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>public bool IsRunningProcessByMutex(){     bool createNew;     using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName

Java--&gt;一个只能运行十次的程序

--> 感觉没什么营养的样子啊... package com.dragon.java.tensoftware; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; /* * 编写一个程序, 该程序只能--运行--10次, 每次运行时提示剩余次数, 10次之后提示已到期 */ public class Test { publi

让程序同时只能运行一个C++ Builder实现(转)

源:让程序同时只能运行一个 很多人都讨论过这个问题, 这里用Victor串口控件里面现成的共享内存功能来实现. 当程序运行第二次时只是激活第一次运行的窗口, 而不是再运行一个程序. 需要在主程序里实现, 下面蓝色的部分是增加的内容: #include <vcl.h> #pragma hdrstop #include "yb_base.h" //------------------------------------------------------------------

C# 程序只能执行一次

应用程序的主入口点. //每一个程序只能运行一个实例 bool isRun = false; System.Threading.Mutex m = new System.Threading.Mutex(false, "LocalServer", out isRun); if (!isRun) { MessageBox.Show("该程序已经在运行!"); return; }