WinForm 应用程序禁止多个进程运行

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

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

namespace 开启新的进程
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
         /// </summary>
        [STAThread]
        static void Main()
        {
            bool flag;
            System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName, out flag);
            if (flag)
            {
                // 启用应用程序的可视样式
                   Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                // 处理当前在消息队列中的所有 Windows 消息
                   Application.DoEvents();
                Application.Run(new Form1());

                // 释放 System.Threading.Mutex 一次
                   mutex.ReleaseMutex();
            }
            else
            {
                MessageBox.Show(null, "相同的程序已经在运行了,请不要同时运行多个程序!\n\n这个程序即将退出!",
                    Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
                Application.Exit();
            }
        }
    }
}

方法二: 禁止多个进程运行,并当重复运行时激活以前的进程

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

namespace 开启新的进程
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
         /// </summary>
        [STAThread]
        static void Main()
        {
            System.Diagnostics.Process instance = RunningInstance();
            if (instance == null)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
            }
            else
            {
                HandleRunningInstance(instance);
            }
        }

        /// <summary>
        /// 获取当前正在运行的进程实例
         /// </summary>
        /// <returns></returns>
        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;
                    }
                }
            }

            // 如果没有其他同名进程存在,则返回 null
            return null;
        }

        // 指示该属性化方法由非托管动态链接库 (DLL) 作为静态入口点公开
         [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;

        /// <summary>
        /// 如果有另一个同名进程启动,则调用之前的实例
         /// </summary>
        /// <param name="instance"></param>
        private static void HandleRunningInstance(Process instance)
        {
            // 确保窗体不是最小化或者最大化
              ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL);
            // 将之前启动的进程实例弄到前台窗口
              SetForegroundWindow(instance.MainWindowHandle);
        }
    }
}
时间: 2024-10-10 01:55:56

WinForm 应用程序禁止多个进程运行的相关文章

c# winform 获取当前程序运行根目录,winform 打开程序运行的文件夹

// 获取程序的基目录. System.AppDomain.CurrentDomain.BaseDirectory // 获取模块的完整路径. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName // 获取和设置当前目录(该进程从中启动的目录)的完全限定目录. System.Environment.CurrentDirectory // 获取应用程序的当前工作目录. System.IO.Directory.GetC

解决Winform应用程序中窗体背景闪烁的问题

本文转载:https://my.oschina.net/Tsybius2014/blog/659742 我的操作系统是Win7,使用的VS版本是VS2012,文中的代码都是C#代码. 这几天遇到一个问题,即我用一个嵌入图片的Panel作为Winform应用程序的背景,如下图所示: 这是一个Winform窗体,里面放置了一个Panel,Dock属性为Fill,BackgroundImage使用了<少年电世界>2003年第02期的封面图片,BackgroundImageLayout使用了Stret

WinForm应用程序中实现自动更新功能

WinForm应用程序中实现自动更新功能 编写人:左丘文 2015-4-20 近来在给一客户实施ECM系统,但他们使用功能并不是我们ECM制造版提供的标准功能,他们要求对系统作一些定制功能,为了避免因程序的bug而带来频繁让用户更新程序的不良影响,就想给ECM增加一个winform自动更新功能,今天在这里,我想与大家一起分享代码,在此做个小结,以供参考.有兴趣的同学,可以一同探讨与学习一下,否则就略过吧.   1. 首先我们在这里先分析一下其它程序猿的一些基本情况: 相信有许多程序猿都喜欢用Wi

使用控制台调试WinForm窗体程序

1.程序代码结构 2.Win32DebuggerHelper.cs using System.Runtime.InteropServices; /* TODO:使用方法 Win32.AllocConsole(); Console.WriteLine(@"我是调试信息:目前已经运行到加载事件中"); */ namespace WinFormUseConsoleToTestProgramDemo { /// <summary> /// 通过控制台Console调试WinForm

是什么在.NET程序关闭时阻碍进程的退出?

在平时使用软件或是.NET程序开发的过程中,我们有时会遇到程序关闭后但进程却没有退出的情况,这往往预示着代码中有问题存在,不能正确的在程序退出时停止代码执行和销毁资源.这个现象有时并不容易被察觉,但在另一些情况下却会产生影响软件功能的Bug.本文列举可能影响.NET程序进程退出的因素,并用几个小例子说明这些因素如何导致Form Application和Windows Service的Bug. 一.进程不能退出对于某些Windows Form程序的影响 在传统C/S结构的系统中,客户端会通过Soc

linux进程(1)--进程运行的环境

linux进程(1)–进程运行的环境 标签(空格分隔): linux 以下内容来自<UNIX环境高级编程>读书笔记 前引 首先想想下面几个问题能不能解答: 当程序被执行的时候,main函数时如何被调用的? 程序在内存的存储空间布局是怎样的? 命令行参数时如何传递给新程序的?进程如何读取环境变量? 进程堆空间的使用 进程的终止方式 进程是程序执行的基本,进程即为程序执行的活动体.下面是进程在系统上运行的一些环境. 一.main函数 int main(int argc, char *argv[])

程序自启动及后台持续运行的研究(voip和GPS方式)

1,voip方式    1)首先要修改应用的plist配置,添加下面的设置:        Application does not run in background: NO        Required background modes: VOIP    注:添加这些配置之后,程序重启解锁就会自动运行application:                                  didFinishLaunchingWithOptions方法.    2)主要测试代码:- (BO

进程篇(1: 进程运行环境)--请参照本博客“操作系统”专栏

2014年5月30日  下午1:40:59 1. Unix 进程执行环境: 1.1 终止处理程序: ISO C 规定,一个程序可以登记多达32个函数,这些函数将由exit自动调用.我们称这些函数为终止处理程序(exit handler),并调用atexit函数来登记这些函数.该函数的原型如下: 1 #include <stdlib.h>2 3 int atexit(void (*function)(void)); exit调用这些终止程序的顺序与他们登记时的顺序相反(先登记后调用).同一个函数

程序、任务、进程和线程的联系与区别

概念: 程序(program)只是一组指令的有序集合. 任务(task)是最抽象的,是一个一般性的术语,指由软件完成的一个活动.一个任务既可以是一个进程,也可以是一个线程.简而言之,它指的是一系列共同达到某一目的的操作.例如,读取数据并将数据放入内存中.这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现. 进程(process)常常被定义为程序的执行.可以把一个进程看成是一个独立的程序,在内存中有其完备的数据空间和代码空间.一个进程所拥有的数据和变量只属于它自己. 进