winform 中实现一个程序只能在一台计算机上运行

using System.Threading;     //需手动添加引用

static void Main()    
{   
    bool initiallyOwned = true;   
    bool isCreated;   
    Mutex m = new Mutex( initiallyOwned, "MyTest", out isCreated);   //Mutex为System.Thread;中的类
    if ( !(initiallyOwned && isCreated) )   
    {   
        MessageBox.Show( "抱歉,程序只能在一台机上运行一个实例!", "提示" );   
        Application.Exit();   
    }   
    else  
    {   
        Application.Run( new MainForm() );   
    }   
}

方法二:

  • 直到现在,为了在Windows下满足上述约束,开发者最常用的方法仍然是使用有名互斥体(named mutex)技术(参见5.7.2节)。然而采用这种技术来满足上述约束存在以下缺点:该技术具有使互斥体的名字被其他应用程序所使用的较小的、潜在的风险。在这种情况下该技术将不再有效并且会造成很难检测到的bug。

  • 该技术不能解决我们仅允许一个应用程序产生N个实例这种一般的问题。

  • 幸而在System.Diagnostics.Process类中拥有GetCurrentProcess()(返回当前进程)和GetPro- cesses()(返回机器上所有的进程)这样的静态方法。在下面的程序中我们为上述问题找到了一个优雅且简单的解决方案。

  static void Main()
        {
            if(TestIfAlreadyRunning())
            {
                MessageBox.Show("该程序已经打开了一个");
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                //Application.Run(new MainForm());
                MainForm frm = new MainForm();
                Sunisoft.IrisSkin.SkinEngine skin = new Sunisoft.IrisSkin.SkinEngine((System.ComponentModel.Component)frm);
                skin.SkinFile = "DeepCyan.ssk";
                skin.TitleFont = new System.Drawing.Font("微软雅黑", 9F);// 指定标题栏的Font。
                Application.Run(frm);
            }
           
        }

        static bool TestIfAlreadyRunning()
        {
            Process processCurrent = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcesses();
            bool result = false;
            foreach(Process process in processes)
            {
                if (processCurrent.Id != process.Id)
                {
                    if (processCurrent.ProcessName == process.ProcessName)
                    {
                        result= true;
                    }
                }
            }
            return result;
        }
通过方法参数指定了远程机器的名字后,GetProcesses()方法也可以返回远程机器上所有的进程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值