zoukankan      html  css  js  c++  java
  • 只运行一个exe应用程序的使用案例

    应用程序的exe启动设置

    using System;
    using System.Diagnostics;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows.Forms;

    namespace OnlyRunOneEXE
    {
    static class Program
    {
    /// <summary>
    /// 应用程序的主入口点。
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    #region 第一种方式
    //if (IsExistRunApplicationOrEXE())
    //{
    // MessageBox.Show("软件已经在运行!!!", "信息提示:");
    // return;
    //}
    //else
    //{
    // Application.Run(new Form1());
    //}
    #endregion

    #region MyRegion

    Process process = RunningInstance();
    if (process != null)
    {
    //MessageBox.Show("软件已经在运行!!!", "信息提示:");
    HandleRunningInstance(process);
    }
    else
    {
    Application.Run(new Form1());
    }
    //Application.Run(new Form1());
    #endregion
    }

    #region 第一种方式
    public static bool IsExistRunApplicationOrEXE()
    {
    Mutex mutex = new Mutex(true, "OnlyRunOneEXE", out bool isCreatedNew);
    Process[] processArrs = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
    if (processArrs.Length > 2 || !isCreatedNew)
    {
    return true;
    }
    return false;
    }

    #endregion

    #region 第二种方式
    [DllImport("User32.dll")]
    private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    [DllImport("User32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    private 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;

    }
    }
    }
    return null;
    }

    private static void HandleRunningInstance(Process instance)
    {
    ShowWindowAsync(instance.MainWindowHandle, 1); //调用api函数,正常显示窗口
    SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端
    }


    //[DllImport("User32.dll")]
    ////返回值:如果窗口原来可见,返回值为非零;如果函数原来被隐藏,返回值为零。
    //private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
    ////API cmdShow 常数定义
    //private const int SW_HIDE = 0;
    //private const int SW_NORMAL = 1; //正常弹出窗体
    //private const int SW_MAXIMIZE = 3; //最大化弹出窗体
    //private const int SW_SHOWNOACTIVATE = 4;
    //private const int SW_SHOW = 5;
    //private const int SW_MINIMIZE = 6;
    //private const int SW_RESTORE = 9;
    //private const int SW_SHOWDEFAULT = 10;
    #endregion
    }
    }

  • 相关阅读:
    统计 (Standard IO)
    存储过程中的错误处理
    簡單SQL存儲過程實例
    SQLSERVER存储过程基本语法
    SQL Server游标的使用【转】
    实现业务系统中的用户权限管理--实现篇
    实现业务系统中的用户权限管理--设计篇
    C#.net 微信公众账号接口开发
    jquery select radio
    asp.net Repeater使用例子,包括分页
  • 原文地址:https://www.cnblogs.com/1175429393wljblog/p/8036308.html
Copyright © 2011-2022 走看看