首页 > 编程语言 >Winform 程序多开

Winform 程序多开

时间:2023-02-23 16:23:54浏览次数:43  
标签:IntPtr 多开 程序 开启 互斥 Mutex 进程 mutex Winform

在使用应用程序的过程中,经常要求应用程序只能运行一次。如果发现重复开启,应从系统进程列表中搜索到已经开启的进程,并将该进程窗口移到最前端显示。

记录一下过程。

实现过程

在 Program.cs 文件的 Program 类中声明两个外部调用函数

        [DllImport("User32")]
        private static extern bool SetForegroundWindow(IntPtr hWnd);
        [DllImport("User32")]
        private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);

两个外部调用 User32.dll 文件中的函数,其中SetForegroundWindow 主要用于将窗体移动到最前端显示,ShowWindowAsync函数用于显示窗。

修改 main 函数内容

static void Main()
{
    bool createdNew;                                        //是否是第一次开启程序
    Mutex mutex = new Mutex(false, "Single", out createdNew);
    mutex.WaitOne();
    //实例化一个进程互斥变量,标记名称Single
    if (!createdNew)                                        //如果多次开启了进程
    {
        Process currentProcess = Process.GetCurrentProcess();//获取当前进程
        foreach (Process process in Process.GetProcessesByName(currentProcess.ProcessName))
        {
            //通过进程ID和程序路径获取一个已经开启的进程
            if ((process.Id != currentProcess.Id) &&
                (Assembly.GetExecutingAssembly().Location == process.MainModule.FileName))
            {
                //获取已经开启的进程的主窗体句柄
                IntPtr mainFormHandle = process.MainWindowHandle;
                if (mainFormHandle != IntPtr.Zero)
                {
                    ShowWindowAsync(mainFormHandle, 1);         //显示已经开启的进程窗口
                    SetForegroundWindow(mainFormHandle);   //将已经开启的进程窗口移动到前端
                }
            }
        }
        //MessageBox.Show("进程已经开启");
        return;
    }
    else
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainFrame());
        mutex.ReleaseMutex();       //释放Mutex一次
    }
}

Mutex类,该类位于System.Threading命名空间下,主要用于创建线程或进程的互斥变量。本实例创建了一个名为Single的互斥变量,在运行程序时,首先访问该互斥变量,看该变量是否已经被创建,如果已经被创建,说明已经有相同的进程正在运行。

关于 Mutex锁 :

C# 针对特定的条件进行锁操作,不用lock,而是mutex

c# 如何针对特定的条件进行锁操作?

C# 多线程系列之Mutex使用

标签:IntPtr,多开,程序,开启,互斥,Mutex,进程,mutex,Winform
From: https://www.cnblogs.com/BoiledYakult/p/17148486.html

相关文章

  • 前端程序员是怎么做物联网开发的
    前端程序员是怎么做物联网开发的上图是我历时一周做的在线的温湿度可视化项目,可以查看截至目前往前一天的温度、湿度变化趋势,并且实时更新当前温湿度本文可能含有知识......
  • 【程序员的福利】手指操:增强记忆力,改善良好睡眠
    手指操第一式旋腕抬指十指放松、交叉,用手腕带动手做转圈运动,顺时针转60下,再逆时针转60下。 第二式轻压松指两手指尖相对,形如握球,轻按挤压至指根相触,反复......
  • SpringBoot10 - 程序的打包与运行
    SpringBoot程序的打包与运行​ 企业项目上线为了保障环境适配性会采用下面流程发布项目,这里不讨论此过程。开发部门使用Git、SVN等版本控制工具上传工程到版本服务器......
  • 编写端口转发程序的总结
    一个端口转发程序,写了快2个星期最开始的时候,是因为没有沟通好程序的需求,不知道程序的目标是什么然后,是因为对于select函数的理解存在问题接着,对于网络编程、系统编程缺......
  • C/C++程序隐藏符号
    使用visibility#ifdef__cplusplus//如果是C++语言#definePASSPORT_EXTERNextern"C"__attribute__((visibility("default")))#else#definePASSPORT_EX......
  • C#将Winform上的TextBox和ComBox的值导入和导出
    一、将所有控件上的值导出到文件1.使用递归遍历窗体上所有的TextBox和ComBox,将控件名称和控件的值存入List实体类Result.cs///<summary>///结果数据///</summary>......
  • 正在保存“index.vue”: 正在运行 "vetur" 格式化程序
    一、问题描述这几天用VSCode突然不能保存格式化文件了。二、把插件 Vetur 降版,我用v0.36.1成功解决了这个问题。如果有其他解决方法,可以发在评论区,感谢!现在最新版本......
  • 字符设备驱动程序按键驱动---中断方式
    中断函数:包含#include<linux/irq.h>request_irq(irq,handle,irqflag,name,dev_id){  1,分配一个irqaction结构体  2、把这个结构体放到irq_desc[irq](action链......
  • 字符设备驱动程序--LED驱动
    编写驱动程序需要编写那些代码:1、硬件相关的驱动程序2、Makefile的编译程序3、还需要编写一个相关的测试程序比如说:一个摄像头驱动程序1、驱动程序的编写,需要编写一些......
  • 字符设备驱动程序之同步互斥阻塞
    1.原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。常用原子操作函数举例:atomic_tv=ATOMIC_INIT(0);//定义原子变量v并初始化为0atomic_read(ato......