解决C#程序只允许运行一个实例的几种方法详解

针对“解决C#程序只允许运行一个实例的几种方法详解”,这是一个常见的需求,我们可以通过以下几种方式来解决。

方法一:使用Mutex互斥量

互斥体是一种用于在进程之间进行同步的对象,也是实现单实例应用程序的首选方法之一。具体操作如下:

  1. 在Program.cs文件中创建一个Mutex对象。
static Mutex mutex = new Mutex(true, "MyApplication");
  • 第一个参数为程序是否拥有Mutex的初始所有权,这里我们选择为“是”,即true。
  • 第二个参数为Mutex的名称,这个名称需要很好地反映出应用程序的名称。

  • 构造没有名称的Mutex会检查j此前是否已存在同名的Mutex。

static Mutex mutex;

static Program()
{
    bool hasHandle = false;
    try
    {
        mutex = new Mutex(true, "MyApplication", out hasHandle);
    }
    catch (Exception ex)
    {
        mutex = null;
        MessageBox.Show(ex.ToString());
    }
    if (!hasHandle)
    {
        MessageBox.Show("MyApplication is already running.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        Environment.Exit(0);
    }
}

方法二:使用Win32 API

使用Win32 API,利用InstallTask钩子函数进行回调。 在实现之前,需要在User32.dll中声明InstallTask钩子函数。具体操作如下:

  1. 声明如下:
[DllImport("user32.dll")]
private static extern IntPtr SetWindowsHookEx(int idHook, HookHandler lpfn, IntPtr hInstance, int threadId);

[DllImport("kernel32.dll")]
private static extern IntPtr GetModuleHandle(string lpModuleName);

[DllImport("user32.dll")]
private static extern int UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll")]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, ref CWPSTRUCT lParam);

const int WH_CALLWNDPROCRET = 12;

delegate IntPtr HookHandler(int nCode, IntPtr wParam, ref CWPSTRUCT lParam);

[StructLayout(LayoutKind.Sequential)]
public struct CWPSTRUCT
{
    public IntPtr lParam;
    public IntPtr wParam;
    public int message;
    public IntPtr hwnd;
}
  1. 在Program.cs文件中创建HOOK
class Program
{
    static void Main(string[] args)
    {
        bool returnValue;
        Mutex mutex = new Mutex(true, "MyApplication", out returnValue);
        if (returnValue)
        {
            IntPtr hInstance = GetModuleHandle(null);
            hookId = SetWindowsHookEx(WH_CALLWNDPROCRET, new HookHandler(MyHookProc), hInstance, 0);
            Application.Run(new Form1());
            UnhookWindowsHookEx(hookId);
            mutex.ReleaseMutex();
        }
        else
        {
            MessageBox.Show("MyApplication is already running.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

    static int hookId;

    static IntPtr MyHookProc(int nCode, IntPtr wParam, ref CWPSTRUCT lParam)
    {
        if (lParam.message == WM_SHOWME)
        {
            Form1.Instance.WindowState = FormWindowState.Normal;
            Form1.Instance.Activate();
        }
        return CallNextHookEx(IntPtr.Zero, nCode, wParam, ref lParam);
    }

    const int WM_SHOWME = 0x18;
}

上述两种方法非常容易实现,并且可以确保程序只运行一个实例。根据需要,可以选择一种方法来实现。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决C#程序只允许运行一个实例的几种方法详解 - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • 使用GPS经纬度定位附近地点(某一点范围内查询)

    使用GPS经纬度定位附近地点的方法,主要分为以下几个步骤: 获取用户的地理位置信息 可以通过HTML5的Geolocation API或第三方地图API(如高德地图、百度地图等)获取用户的经纬度信息。在使用第三方地图API时,可以使用经纬度逆向地理编码的接口获取用户所在地的详细地址。 示例代码: navigator.geolocation.getCurren…

    C# 2023年6月8日
    00
  • C# TextWriter.WriteAsync – 异步写入一个字符

    TextWriter.WriteAsync 方法的作用与使用方法 TextWriter.WriteAsync 方法是 C# 中异步写入文本内容的方法,通过该方法可以在不阻塞主线程的情况下,将文本异步地写入到指定的文本流中。 该方法返回类型为 Task,表示该方法是异步执行的方法。 TextWriter.WriteAsync 方法的详细使用攻略 方法签名: p…

    C# 2023年4月19日
    00
  • .NET实现:将EXE设置开机自动启动

    首先需要说明的是,将EXE设置开机自动启动的操作不是由.NET实现的,而是由操作系统和桌面环境提供的功能实现的。 在Windows操作系统中,可以通过两种方式实现将EXE设置开机自动启动。 1.在启动文件夹中创建快捷方式 在Windows操作系统中,可以将应用程序的快捷方式放置到启动文件夹中,这样系统会在启动时自动运行该快捷方式所指向的应用程序。 要将应用程…

    C# 2023年5月15日
    00
  • C# 中 Array和 ArrayList详解及区别

    C# 中 Array 和 ArrayList 详解及区别 什么是数组? 在 C# 中,数组是一种类型强制定义并具有相同数据类型的数据结构。数组的元素可以通过索引进行访问,索引是数组中元素的唯一编号,从零开始并从左到右。数组的长度是在创建数组时确定的。 什么是 ArrayList? C# 中的 ArrayList 是一个动态数组,可以根据需要自动增长和缩小其大…

    C# 2023年6月7日
    00
  • asp.net 多字段模糊查询代码

    请允许我详细讲解一下实现 ASP.NET 多字段模糊查询的完整攻略。以下是步骤和代码示例: 1. 创建 ASP.NET Web 应用程序 首先,在 Visual Studio 中创建一个 ASP.NET Web 应用程序。选择“Web Application(.NET Framework)”模板,名称为“MultiFieldFuzzySearch”,创建一个…

    C# 2023年5月31日
    00
  • 基于John Carmark密码详解

    基于John Carmack密码详解 什么是John Carmack密码? John Carmack密码,也称为“DooM3密码”,是由游戏开发者John Carmack在2004年所创造的密码。这种密码的特点在于:使用了MD5哈希加密算法,并且还有一些特殊的操作。 John Carmack密码的组成 John Carmack密码由以下几个部分组成: 一个固…

    C# 2023年6月7日
    00
  • C# WinForm快捷键设置技巧

    C# WinForm快捷键设置技巧 在C# WinForm程序的开发中,设置快捷键是提高用户体验的一种重要手段。本文将详细介绍如何在WinForm中设置快捷键,包括以下内容: 设置按钮控件的快捷键 设置菜单项的快捷键 设置按钮控件的快捷键 我们可以使用Button控件的UseVisualStyleBackColor属性设置快捷键。在Button控件中设置了&…

    C# 2023年6月7日
    00
  • C#判断字符串是否是int/double(实例)

    下面就是详细的攻略: 题目背景 在我们的日常工作中,可能会遇到需要判断一个字符串值是否是整数或者浮点数。比如,我们从用户输入表单中获取到了一个值,我们需要判断这个值是不是整数或浮点数。在C#中,我们可以采用以下的方式来判断字符串是否是整数或者浮点数。 判断字符串是否是整数 我们可以使用C#内置的TryParse方法来判断一个字符串是否是整数,并且可以获取到整…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部