• C# WPF开机自启动和只允许一个程序运行


    本文出自:https://www.cnblogs.com/2186009311CFF/p/10024949.html

    在App.xaml.cs填充一下内容,即可实现只允许一个运行,且不解锁屏幕的情况下,重启运行。

     public partial class App : Application
        {
            System.Threading.Mutex mutex;
            public App()
            {
                this.Startup += new StartupEventHandler(App_Startup);
                this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(Application_DispatcherUnhandledException);
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
            }
            private void App_Startup(object sender, StartupEventArgs e)
            {
                bool ret;
                mutex = new System.Threading.Mutex(true, "TestEXEName", out ret);
    
                if (!ret)
                {
                    MessageBox.Show("已有一个客户端正在运行,请先结束原来客户端!");
                    Environment.Exit(0);
                }
                #region 设置程序开机自动运行(+注册表项)
                try
                {
                    SetSelfStarting(true, "TestEXEName.exe");
                }
                catch (Exception ex)
                {
                    WriteLog(ex);
                }
                
                #endregion
    
            }
            private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
            {
                if (e.ExceptionObject is Exception)
                    WriteLog(e.ExceptionObject);
                else
                    WriteLog(e);
            }
    
            private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
            {
                if (e.Exception is Exception)
                    WriteLog(e.Exception);
                else
                    WriteLog(e);
            }
    
            #region 注册表开机自启动
    
    
            /// <summary>
            /// 开机自动启动
            /// </summary>
            /// <param name="started">设置开机启动,或取消开机启动</param>
            /// <param name="exeName">注册表中的名称</param>
            /// <returns>开启或停用是否成功</returns>
            public bool SetSelfStarting(bool started, string exeName)
            {
                RegistryKey key = null;
                try
                {
    
                    string exeDir = System.Windows.Forms.Application.ExecutablePath;
                    //RegistryKey HKLM = Registry.CurrentUser;
                    //key = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);//打开注册表子项
                    key = Registry.CurrentUser.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run", true);//打开注册表子项
    
                    if (key == null)//如果该项不存在的话,则创建该子项
                    {
                        key = Registry.LocalMachine.CreateSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
                    }
                    if (started)
                    {
                        try
                        {
                            object ob = key.GetValue(exeName, -1);
    
                            if (!ob.ToString().Equals(exeDir))
                            {
                                if (!ob.ToString().Equals("-1"))
                                {
                                    key.DeleteValue(exeName);//取消开机启动
                                }
                                key.SetValue(exeName, exeDir);//设置为开机启动
                            }
                            key.Close();
    
                        }
                        catch (Exception ex)
                        {
                            WriteLog(ex);
                            return false;
                        }
                    }
                    else
                    {
                        try
                        {
                            key.DeleteValue(exeName);//取消开机启动
                            key.Close();
                        }
                        catch (Exception ex)
                        {
                            WriteLog(ex);
                            return false;
                        }
                    }
                    return true;
                }
                catch (Exception ex)
                {
                    WriteLog(ex);
                    if (key != null)
                    {
                        key.Close();
                    }
                    return false;
                }
            }
    
            #endregion
    
            private  void WriteLog(object exception)
            {
                Exception ex = exception as Exception;
    
                using (FileStream fs = File.Open(".//ErrorLog.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    fs.Seek(0, SeekOrigin.End);
                    byte[] buffer = Encoding.Default.GetBytes("-------------------------------------------------------
    ");
                    fs.Write(buffer, 0, buffer.Length);
    
                    buffer = Encoding.Default.GetBytes(DateTime.Now.ToString() + "
    ");
                    fs.Write(buffer, 0, buffer.Length);
    
                    if (ex != null)
                    {
                        buffer = Encoding.Default.GetBytes("成员名: " + ex.TargetSite + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
    
                        buffer = Encoding.Default.GetBytes("引发异常的类: " + ex.TargetSite.DeclaringType + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
    
                        buffer = Encoding.Default.GetBytes("异常信息: " + ex.Message + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
    
                        buffer = Encoding.Default.GetBytes("引发异常的程序集或对象: " + ex.Source + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
    
                        buffer = Encoding.Default.GetBytes("栈:" + ex.StackTrace + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
                    }
                    else
                    {
                        buffer = Encoding.Default.GetBytes("应用程序错误: " + exception.ToString() + "
    ");
                        fs.Write(buffer, 0, buffer.Length);
                    }
                }
    
            }
        }

    参考:https://bbs.csdn.net/topics/390951628?page=1

    https://www.cnblogs.com/gaobing/p/gaobing.html

  • 相关阅读:
    关于sqlserver2008 bcp根据数据表导出xml格式文件的小记
    关于SQL SERVER 2008 X64版本报错:消息 7302,级别 16,无法创建链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 的实例。
    Response.Redirect(),Server.Transfer(),Server.Execute()的区别[转]
    ASP.net应用程序中如何调用客户端的Javascript脚本小结(转)
    重写ListView控件,实现点击列头排序的功能
    关于Response.redirect和Response.End出现线程中止异常的处理(转)
    持续集成cruisecontrol.net学习总结
    [转]关于PowerDesigner反向工程SQL Server2000数据库时生成注释的解决方法
    敏捷开发scrum学习笔记一
    asp.net缓存机制总结(转)
  • 原文地址:https://www.cnblogs.com/2186009311CFF/p/10024949.html
Copyright © 2020-2023  润新知