zoukankan      html  css  js  c++  java
  • C#代码实现,确保windows程序只有一个实例(instance)

    static class Program
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
    //防止程序多次运行
    if (!OneInstance.IsFirst("GetPayInfo"))
    {
    MessageBox.Show("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!", "程序错误提示:", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    return;
    }

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
    }
    }

    // ******************* 防止程序多次执行 **************************
    public abstract class OneInstance
    {
    ///<summary>
    ///判断程序是否正在运行
    ///</summary>
    ///<param name="appId">程序名称</param>
    ///<returns>如果程序是第一次运行返回True,否则返回False</returns>
    public static bool IsFirst(string appId)
    {
    bool ret = false;
    if (OpenMutex(0x1F0001, 0, appId) == IntPtr.Zero)
    {
    CreateMutex(IntPtr.Zero, 0, appId);
    ret = true;
    }
    return ret;
    }
    /// <summary>
    /// 为现有的一个已命名互斥体对象创建一个新句柄
    /// </summary>
    /// <param name="dwDesiredAccess"></param>
    /// <param name="bInheritHandle">如希望子进程能够继承句柄,则为TRUE</param>
    /// <param name="lpName">要打开对象的名字</param>
    /// <returns></returns>
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr OpenMutex(
    uint dwDesiredAccess, // access
    int bInheritHandle, // inheritance option
    string lpName // object name
    );

    /// <summary>
    /// 找出当前系统是否已经存在指定进程的实例。
    /// 如果没有则创建一个互斥体。
    /// CreateMutex()函数可用来创建一个有名或无名的互斥量对象:
    /// </summary>
    /// <param name="lpMutexAttributes">指向安全属性的指针</param>
    /// <param name="bInitialOwner">初始化互斥对象的所有者</param>
    /// <param name="lpName">指向互斥对象名的指针</param>
    /// <returns></returns>
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr CreateMutex(
    IntPtr lpMutexAttributes, // SD
    int bInitialOwner, // initial owner
    string lpName // object name
    );
    }

  • 相关阅读:
    面向对象之多态(向上转型与向下转型)
    【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法
    自动装箱的本质是什么呢?
    基本数据类型float和double的区别
    Java中this和super的用法总结
    面试题——太(上)
    面试题——蓝
    C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
    C语言——内存分配
    面试题——超
  • 原文地址:https://www.cnblogs.com/eric-xiongzw/p/3554553.html
Copyright © 2011-2022 走看看