zoukankan      html  css  js  c++  java
  • 转C# 只能运行一个winForm进程

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Windows.Forms;

    using System.Diagnostics;

    using System.Runtime.InteropServices;

    using System.Reflection;

    namespace OnlyProcess

    {

        static class Program

        {

            [STAThread]

            static void Main()

            {

                MessageBox.Show("ddddd");

                Process instance = RunningInstance();

                if (instance == null)

                {

                    System.Windows.Forms.Application.EnableVisualStyles();    //这两行可以让窗体具有XP风格.

                    System.Windows.Forms.Application.DoEvents();

                    Application.Run(new Form1());

                }

                else

                {

                    HandleRunningInstance(instance);

                }

            }

     

            #region   只运行一个实例

            public static Process RunningInstance()

            {

                Process current = Process.GetCurrentProcess();//当前新启动的线程

                Process[] processes = Process.GetProcessesByName(current.ProcessName);

                //遍历与当前进程名称相同的进程列表

                foreach (Process process in processes)

                {

                    //process,原来旧的线程与当前新启动的线程ID不一样

                    //Ignore the current process

                    if (process.Id != current.Id)

                    {

                        //Make sure that the process is running from the exe file.

                        if (Assembly.GetExecutingAssembly().Location.Replace("/", "//") == current.MainModule.FileName)

                        {

                            //Return the other process instance.

                            return process;//返回原来旧线程的窗体

                        }

                    }

                }

                return null;

            }

            private static void HandleRunningInstance(Process instance)

            {

                MessageBox.Show("该应用系统已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);

                ShowWindowAsync(instance.MainWindowHandle, WS_SHOWNORMAL); //调用api函数,正常显示窗口

                SetForegroundWindow(instance.MainWindowHandle); //将窗口放置最前端。

            }

            [DllImport("User32.dll")]

            private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);

            [DllImport("User32.dll")]

            private static extern bool SetForegroundWindow(System.IntPtr hWnd);

            private const int WS_SHOWNORMAL = 1;

            #endregion

        }

    }

     

     

     

    //namespace OnlyProcess

    //{

    //    static class Program

    //    {

    //        /// <summary>

    //        /// 应用程序的主入口点。

    //        /// </summary>

    //        [STAThread]

    //        static void Main()

    //        {

    //            //get the name of our process

    //            string proc = Process.GetCurrentProcess().ProcessName;

    //            //get the list of all processes by that name

    //            Process[] processes = Process.GetProcessesByName(proc);

    //            //if there is more than one process

    //            if (processes.Length > 1)

    //            {

    //                DialogResult dr = MessageBox.Show("Application is already running! Are you sure want to run another?", "INFORMATION", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);

     

    //                if (dr == DialogResult.OK)

    //                {

    //                    Application.EnableVisualStyles();

    //                    Application.SetCompatibleTextRenderingDefault(false);

    //                    Application.Run(new Form1());

    //                }

    //            }

    //            else

    //            {

    //                Application.EnableVisualStyles();

    //                Application.SetCompatibleTextRenderingDefault(false);

    //                Application.Run(new Form1());

    //            }

    //        }

    //    }

    //}

     

     

    C# 创建互斥进程(程序) 互斥进程(程序), 简单点说,就是在系统中只能有该程序的一个实例运行. 现在很多软件都有这功能,如Maxthon 可以设置为"只允许打开一个窗体",还有Bitcomet等. 我也是看到这些软件的这个功能才来研究这个问题的. 要实现程序的互斥,通常有4中方式,下面用 C# 语言来实现:

    实现方式一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.C#实现如下:

    把program.cs文件里的Main()函数改为如下代码:

    static void Main()

    {

    bool runone;

    System.Threading.Mutex run = new System.Threading.Mutex(true, "jiaao_test", out runone);

    if (runone)

    {

    run.ReleaseMutex();

    Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false);

    Application.Run(new Form1());

    }

    else

    { MessageBox.Show("已经运行了一个实例了。");

    }

    }

  • 相关阅读:
    5的阶乘以及任意输入一个数的阶乘
    继入门程序后的第一篇函数调用的小程序 比较两数大小
    计算机网络01-计算机网络与因特网
    2021春招冲刺-1227 数组去重 | 响应式布局 | 媒体查询 |浏览器帧
    2021春招冲刺-1225 TCP与UDP | 单例模式 | 回流与重绘
    2021春招冲刺-1223 进程线程的通信 | 字符串是否有效 | 数组转换与展平
    2021春招冲刺-1221 进程与线程的区别 | 进程的切换 | 单链表是否相交 | 元素水平/垂直居中的方式
    左边固定,右边自适应解决方案
    mock 模拟数据在框架中的简单使用
    一个页面从输入url到加载到内容,这个过程经历了什么
  • 原文地址:https://www.cnblogs.com/duguzhenglong/p/2745914.html
Copyright © 2011-2022 走看看