Browse Source

modify:优化解析excel的合并单元格查找处理;添加开机启动,自动登录的逻辑

runming56 1 year ago
parent
commit
09dd824b03

+ 8 - 2
lqnet/Api/MyConstants.cs

@@ -1,5 +1,6 @@
 
 
 using System.Drawing;
 using System.Drawing;
+using System.Windows.Forms;
 
 
 namespace lqnet.Api
 namespace lqnet.Api
 {
 {
@@ -33,9 +34,14 @@ namespace lqnet.Api
     }
     }
     public class VariablesGlobal
     public class VariablesGlobal
     {
     {
-        public static string IP_PORT = "http://10.60.102.252:8088/";
-        //public static string IP_PORT = "http://10.60.102.253:8088/";
+        //public static string IP_PORT = "http://10.60.102.252:8088/";
+        public static string IP_PORT = "http://10.60.102.253:8088/";
         //public static string IP_PORT = "http://192.168.1.4:8190/";
         //public static string IP_PORT = "http://192.168.1.4:8190/";
+        //public static string IP_PORT = "http://tdm.jgiot.com:7012/dev-api/";
         public static string USER_TOKEN = "";
         public static string USER_TOKEN = "";
+        /// <summary>
+        /// 当前窗口
+        /// </summary>
+        public static Form currentForm = null;
     }
     }
 }
 }

+ 93 - 5
lqnet/Application.cs

@@ -1,4 +1,10 @@
-using System;
+using lqnet.Api;
+using lqnet.Forms;
+using Microsoft.VisualBasic.ApplicationServices;
+using Microsoft.Win32;
+using System;
+using System.Diagnostics;
+using System.Security.Principal;
 using System.Text;
 using System.Text;
 using System.Windows.Forms;
 using System.Windows.Forms;
 
 
@@ -23,11 +29,25 @@ namespace lqnet
                 //设置应用程序处理异常
                 //设置应用程序处理异常
                 System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                 System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
                 System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
                 System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
-                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
-
+                AppDomain.CurrentDomain.UnhandledException += new System.UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
+                string[] args = Environment.GetCommandLineArgs();
                 System.Windows.Forms.Application.EnableVisualStyles();
                 System.Windows.Forms.Application.EnableVisualStyles();
                 System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(true);
                 System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(true);
-                System.Windows.Forms.Application.Run(new LoginForm());
+                WindowsIdentity identity = WindowsIdentity.GetCurrent();
+                WindowsPrincipal principal = new WindowsPrincipal(identity);
+                bool isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
+                if(!isAdmin)
+                {
+                    ProcessStartInfo startInfo = new ProcessStartInfo();
+                    startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
+                    startInfo.Verb = "runas";
+                    Process.Start(startInfo);
+                } else
+                {
+                    //System.Windows.Forms.Application.Run(new LoginForm());
+                    SingleInstanceController controller = new SingleInstanceController();
+                    controller.Run(args);
+                }
             }
             }
             catch (Exception e)
             catch (Exception e)
             {
             {
@@ -37,13 +57,81 @@ namespace lqnet
 
 
         }
         }
 
 
+        public static void Fun_AutoStart(bool isAutoRun = true)
+        {
+            try
+            {
+                string path = System.Windows.Forms.Application.ExecutablePath;
+                RegistryKey rk = Registry.LocalMachine;
+                RegistryKey rk2 = rk.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Run");
+                if (isAutoRun)
+                    rk2.SetValue("System Security", path); //rk2.DeleteValue(“OIMSServer”, false);
+                else
+                    rk2.DeleteValue("System Security", false);
+                rk2.Close();
+                rk.Close();
+            }
+            catch
+            {
+                MessageBox.Show("开机自动启动服务注册被拒绝!请确认有系统管理员权限!");
+            }
+        }
+        /// <summary>
+        /// 保证单例启动
+        /// </summary>
+        public class SingleInstanceController : WindowsFormsApplicationBase
+        {
+            public SingleInstanceController()
+            {
+                IsSingleInstance = true;
+
+                StartupNextInstance += this_StartupNextInstance;
+            }
+
+            void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
+            {
+                if (VariablesGlobal.currentForm !=null)
+                {
+                    MainForm = VariablesGlobal.currentForm;
+                    if(MainForm is lqnet.Forms.MainForm)
+                    {
+                        lqnet.Forms.MainForm form = MainForm as lqnet.Forms.MainForm;
+                        //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                        form.ReDisplay();
+                    } else
+                    {
+                        LoginForm form = MainForm as LoginForm;
+                        //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                        form.ReDisplay();
+                    }
+                } else
+                {
+                    LoginForm form = MainForm as LoginForm;
+                    //这个方法是处理窗体状态的,自己想要最大化还是正常显示都可以
+                    form.ReDisplay();
+                }
+            }
+
+            protected override void OnCreateMainForm()
+            {
+                if (VariablesGlobal.currentForm != null)
+                {
+                    MainForm = VariablesGlobal.currentForm;
+                } else
+                {
+                    //创建登录窗口
+                    MainForm = new LoginForm();
+                } 
+            }
+        }
+
         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
         static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
         {
         {
             string str = GetExceptionMsg(e.Exception, e.ToString());
             string str = GetExceptionMsg(e.Exception, e.ToString());
             MessageBox.Show(str, "插件异常", MessageBoxButtons.OK);
             MessageBox.Show(str, "插件异常", MessageBoxButtons.OK);
         }
         }
 
 
-        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
+        static void CurrentDomain_UnhandledException(object sender, System.UnhandledExceptionEventArgs e)
         {
         {
             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
             string str = GetExceptionMsg(e.ExceptionObject as Exception, e.ToString());
             MessageBox.Show(str, "插件未处理异常", MessageBoxButtons.OK);
             MessageBox.Show(str, "插件未处理异常", MessageBoxButtons.OK);

+ 7 - 0
lqnet/Entities/User.cs

@@ -8,5 +8,12 @@ namespace lqnet.Entities
         public string Username { get; set; }
         public string Username { get; set; }
         [JsonProperty(PropertyName = "password")]
         [JsonProperty(PropertyName = "password")]
         public string Password { get; set; }
         public string Password { get; set; }
+
+        [JsonProperty(PropertyName = "hosts")]
+        public string Hosts { get; set; }
+        [JsonProperty(PropertyName = "device")]
+        public DeviceInfo Device {  get; set; }
+        [JsonProperty(PropertyName = "autLogin")]
+        public bool AutoLogin { get; set; } = false;
     }
     }
 }
 }

+ 32 - 7
lqnet/Forms/LoginForm.Designer.cs

@@ -62,6 +62,7 @@ namespace lqnet
             this.ipLabel = new System.Windows.Forms.Label();
             this.ipLabel = new System.Windows.Forms.Label();
             this.addressShowLabel = new System.Windows.Forms.Label();
             this.addressShowLabel = new System.Windows.Forms.Label();
             this.label1 = new System.Windows.Forms.Label();
             this.label1 = new System.Windows.Forms.Label();
+            this.AutoLoginCb = new System.Windows.Forms.CheckBox();
             this.SuspendLayout();
             this.SuspendLayout();
             // 
             // 
             // pwd_textBox
             // pwd_textBox
@@ -86,9 +87,11 @@ namespace lqnet
             | System.Windows.Forms.AnchorStyles.Right)));
             | System.Windows.Forms.AnchorStyles.Right)));
             this.mindPwd.AutoSize = true;
             this.mindPwd.AutoSize = true;
             this.mindPwd.BackColor = System.Drawing.Color.Transparent;
             this.mindPwd.BackColor = System.Drawing.Color.Transparent;
+            this.mindPwd.Checked = true;
+            this.mindPwd.CheckState = System.Windows.Forms.CheckState.Checked;
             this.mindPwd.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
             this.mindPwd.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
             this.mindPwd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
             this.mindPwd.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.mindPwd.Location = new System.Drawing.Point(216, 106);
+            this.mindPwd.Location = new System.Drawing.Point(300, 241);
             this.mindPwd.Name = "mindPwd";
             this.mindPwd.Name = "mindPwd";
             this.mindPwd.Size = new System.Drawing.Size(118, 31);
             this.mindPwd.Size = new System.Drawing.Size(118, 31);
             this.mindPwd.TabIndex = 11;
             this.mindPwd.TabIndex = 11;
@@ -169,7 +172,7 @@ namespace lqnet
             this.Ip_set.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
             this.Ip_set.FlatAppearance.MouseOverBackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
             this.Ip_set.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.Ip_set.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.Ip_set.Font = new System.Drawing.Font("宋体", 10F);
             this.Ip_set.Font = new System.Drawing.Font("宋体", 10F);
-            this.Ip_set.Location = new System.Drawing.Point(474, 152);
+            this.Ip_set.Location = new System.Drawing.Point(474, 116);
             this.Ip_set.Name = "Ip_set";
             this.Ip_set.Name = "Ip_set";
             this.Ip_set.Size = new System.Drawing.Size(72, 33);
             this.Ip_set.Size = new System.Drawing.Size(72, 33);
             this.Ip_set.TabIndex = 14;
             this.Ip_set.TabIndex = 14;
@@ -186,7 +189,7 @@ namespace lqnet
             this.deviceLabel.BackColor = System.Drawing.Color.Transparent;
             this.deviceLabel.BackColor = System.Drawing.Color.Transparent;
             this.deviceLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
             this.deviceLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.deviceLabel.Location = new System.Drawing.Point(91, 238);
+            this.deviceLabel.Location = new System.Drawing.Point(91, 199);
             this.deviceLabel.Name = "deviceLabel";
             this.deviceLabel.Name = "deviceLabel";
             this.deviceLabel.Size = new System.Drawing.Size(98, 22);
             this.deviceLabel.Size = new System.Drawing.Size(98, 22);
             this.deviceLabel.TabIndex = 16;
             this.deviceLabel.TabIndex = 16;
@@ -200,7 +203,7 @@ namespace lqnet
             this.deviceListCombox.Enabled = false;
             this.deviceListCombox.Enabled = false;
             this.deviceListCombox.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceListCombox.Font = new System.Drawing.Font("宋体", 11F);
             this.deviceListCombox.FormattingEnabled = true;
             this.deviceListCombox.FormattingEnabled = true;
-            this.deviceListCombox.Location = new System.Drawing.Point(217, 235);
+            this.deviceListCombox.Location = new System.Drawing.Point(217, 196);
             this.deviceListCombox.Name = "deviceListCombox";
             this.deviceListCombox.Name = "deviceListCombox";
             this.deviceListCombox.Size = new System.Drawing.Size(237, 30);
             this.deviceListCombox.Size = new System.Drawing.Size(237, 30);
             this.deviceListCombox.TabIndex = 17;
             this.deviceListCombox.TabIndex = 17;
@@ -219,7 +222,7 @@ namespace lqnet
             this.chooseDeviceBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.chooseDeviceBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
             this.chooseDeviceBtn.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.chooseDeviceBtn.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.chooseDeviceBtn.ForeColor = System.Drawing.Color.White;
             this.chooseDeviceBtn.ForeColor = System.Drawing.Color.White;
-            this.chooseDeviceBtn.Location = new System.Drawing.Point(474, 235);
+            this.chooseDeviceBtn.Location = new System.Drawing.Point(474, 196);
             this.chooseDeviceBtn.Name = "chooseDeviceBtn";
             this.chooseDeviceBtn.Name = "chooseDeviceBtn";
             this.chooseDeviceBtn.Size = new System.Drawing.Size(72, 32);
             this.chooseDeviceBtn.Size = new System.Drawing.Size(72, 32);
             this.chooseDeviceBtn.TabIndex = 18;
             this.chooseDeviceBtn.TabIndex = 18;
@@ -236,7 +239,7 @@ namespace lqnet
             this.ipLabel.BackColor = System.Drawing.Color.Transparent;
             this.ipLabel.BackColor = System.Drawing.Color.Transparent;
             this.ipLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.ipLabel.Font = new System.Drawing.Font("宋体", 11F);
             this.ipLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
             this.ipLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
-            this.ipLabel.Location = new System.Drawing.Point(113, 158);
+            this.ipLabel.Location = new System.Drawing.Point(113, 122);
             this.ipLabel.Name = "ipLabel";
             this.ipLabel.Name = "ipLabel";
             this.ipLabel.Size = new System.Drawing.Size(76, 22);
             this.ipLabel.Size = new System.Drawing.Size(76, 22);
             this.ipLabel.TabIndex = 19;
             this.ipLabel.TabIndex = 19;
@@ -250,7 +253,7 @@ namespace lqnet
             this.addressShowLabel.BackColor = System.Drawing.Color.Transparent;
             this.addressShowLabel.BackColor = System.Drawing.Color.Transparent;
             this.addressShowLabel.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.addressShowLabel.Font = new System.Drawing.Font("宋体", 10F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
             this.addressShowLabel.ForeColor = System.Drawing.Color.Black;
             this.addressShowLabel.ForeColor = System.Drawing.Color.Black;
-            this.addressShowLabel.Location = new System.Drawing.Point(212, 158);
+            this.addressShowLabel.Location = new System.Drawing.Point(212, 122);
             this.addressShowLabel.Name = "addressShowLabel";
             this.addressShowLabel.Name = "addressShowLabel";
             this.addressShowLabel.Size = new System.Drawing.Size(242, 40);
             this.addressShowLabel.Size = new System.Drawing.Size(242, 40);
             this.addressShowLabel.TabIndex = 20;
             this.addressShowLabel.TabIndex = 20;
@@ -268,6 +271,25 @@ namespace lqnet
             this.label1.TabIndex = 21;
             this.label1.TabIndex = 21;
             this.label1.Text = "version 1.1.0";
             this.label1.Text = "version 1.1.0";
             // 
             // 
+            // AutoLoginCb
+            // 
+            this.AutoLoginCb.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.AutoLoginCb.AutoSize = true;
+            this.AutoLoginCb.BackColor = System.Drawing.Color.Transparent;
+            this.AutoLoginCb.Checked = true;
+            this.AutoLoginCb.CheckState = System.Windows.Forms.CheckState.Checked;
+            this.AutoLoginCb.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F);
+            this.AutoLoginCb.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(110)))), ((int)(((byte)(121)))), ((int)(((byte)(147)))));
+            this.AutoLoginCb.Location = new System.Drawing.Point(151, 241);
+            this.AutoLoginCb.Name = "AutoLoginCb";
+            this.AutoLoginCb.Size = new System.Drawing.Size(118, 31);
+            this.AutoLoginCb.TabIndex = 22;
+            this.AutoLoginCb.Text = "自动登录";
+            this.AutoLoginCb.UseVisualStyleBackColor = false;
+            this.AutoLoginCb.CheckedChanged += new System.EventHandler(this.AutoLoginCb_Change);
+            // 
             // LoginForm
             // LoginForm
             // 
             // 
             this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F);
             this.AutoScaleDimensions = new System.Drawing.SizeF(144F, 144F);
@@ -275,6 +297,7 @@ namespace lqnet
             this.AutoSize = true;
             this.AutoSize = true;
             this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
             this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(240)))), ((int)(((byte)(240)))), ((int)(((byte)(240)))));
             this.ClientSize = new System.Drawing.Size(594, 395);
             this.ClientSize = new System.Drawing.Size(594, 395);
+            this.Controls.Add(this.AutoLoginCb);
             this.Controls.Add(this.label1);
             this.Controls.Add(this.label1);
             this.Controls.Add(this.addressShowLabel);
             this.Controls.Add(this.addressShowLabel);
             this.Controls.Add(this.ipLabel);
             this.Controls.Add(this.ipLabel);
@@ -296,6 +319,7 @@ namespace lqnet
             this.Name = "LoginForm";
             this.Name = "LoginForm";
             this.Text = "TDM测试台数据传输终端";
             this.Text = "TDM测试台数据传输终端";
             this.Load += new System.EventHandler(this.Login_Load);
             this.Load += new System.EventHandler(this.Login_Load);
+            this.Shown += new System.EventHandler(this.Login_Shown);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
             this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Login_KeyUp);
             this.KeyUp += new System.Windows.Forms.KeyEventHandler(this.Login_KeyUp);
             this.ResumeLayout(false);
             this.ResumeLayout(false);
@@ -318,6 +342,7 @@ namespace lqnet
         private Label ipLabel;
         private Label ipLabel;
         private Label addressShowLabel;
         private Label addressShowLabel;
         private Label label1;
         private Label label1;
+        private CheckBox AutoLoginCb;
     }
     }
 }
 }
 
 

+ 107 - 6
lqnet/Forms/LoginForm.cs

@@ -9,6 +9,7 @@ using lqnet.Api;
 using lqnet.Entities;
 using lqnet.Entities;
 using lqnet.Forms;
 using lqnet.Forms;
 using lqnet.Utils;
 using lqnet.Utils;
+using Microsoft.Win32;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
 using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window;
 
 
@@ -57,11 +58,12 @@ namespace lqnet
                 this.mindPwd.BackColor = MyConstants.BACKGROUDIMG_COLOR;
                 this.mindPwd.BackColor = MyConstants.BACKGROUDIMG_COLOR;
                 //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
                 //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
             }
             }
-            //记住密码
-            Init_MindPwd();
             this.addressShowLabel.Text = VariablesGlobal.IP_PORT;
             this.addressShowLabel.Text = VariablesGlobal.IP_PORT;
             this.Ip_port = VariablesGlobal.IP_PORT;
             this.Ip_port = VariablesGlobal.IP_PORT;
             this.login_button.Select();
             this.login_button.Select();
+            VariablesGlobal.currentForm = this;
+            //加载用户名密码
+            Init_MindPwd();
         }
         }
 
 
         private void reInitComponent()
         private void reInitComponent()
@@ -111,8 +113,15 @@ namespace lqnet
         /// <summary>
         /// <summary>
         /// 记住密码
         /// 记住密码
         /// </summary>
         /// </summary>
-        private void Init_MindPwd()
+        private bool Init_MindPwd()
         {
         {
+            bool condition = false;
+            if (!File.Exists(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH))
+            {
+                this.mindPwd.Checked = false;
+                this.AutoLoginCb.Checked = false;
+                return condition;
+            }
             try
             try
             {
             {
                 using (StreamReader sr = new StreamReader(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH))
                 using (StreamReader sr = new StreamReader(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH))
@@ -127,11 +136,32 @@ namespace lqnet
                     this.mindPwd.Checked = true;
                     this.mindPwd.Checked = true;
                     this.userName_textBox.Text = u.Username;
                     this.userName_textBox.Text = u.Username;
                     this.pwd_textBox.Text = u.Password;
                     this.pwd_textBox.Text = u.Password;
+                    this.AutoLoginCb.Checked = u.AutoLogin;
+                    if (this.AutoLoginCb.Checked)
+                    {
+                        //自动登录设置自动选择记住密码
+                        this.mindPwd.Checked = true;
+                    }
+                    if(!string.IsNullOrEmpty(u.Hosts) && !string.IsNullOrWhiteSpace(u.Hosts))
+                    {
+                        this.addressShowLabel.Text = u.Hosts;
+                        this.Ip_port = u.Hosts;
+                        VariablesGlobal.IP_PORT = u.Hosts;
+                    }
+                    if (u.Device != null)
+                    {
+                        this.deviceListCombox.Items.Clear();
+                        this.deviceListCombox.Items.Add(u.Device);
+                        this.deviceListCombox.DisplayMember = "equitName";
+                        this.deviceListCombox.ValueMember = "propertyCode";
+                        this.deviceListCombox.SelectedIndex = 0;
+                    }
                 }
                 }
             }
             }
             catch (Exception)
             catch (Exception)
             {
             {
             }
             }
+            return this.AutoLoginCb.Checked;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -178,20 +208,38 @@ namespace lqnet
                             User user = new User
                             User user = new User
                             {
                             {
                                 Username = u,
                                 Username = u,
-                                Password = p
+                                Password = p,
+                                Hosts = this.Ip_port,
+                                Device = deviceInfo,
+                                AutoLogin = this.AutoLoginCb.Checked
                             };
                             };
                             var uBytes = Encoding.UTF8.GetBytes(Base64.Base64EnCodeMoreOnlyTwo(JsonConvert.SerializeObject(user)));
                             var uBytes = Encoding.UTF8.GetBytes(Base64.Base64EnCodeMoreOnlyTwo(JsonConvert.SerializeObject(user)));
                             FileStream file = new FileStream(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH,
                             FileStream file = new FileStream(Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH,
                                        FileMode.Create, FileAccess.ReadWrite);
                                        FileMode.Create, FileAccess.ReadWrite);
                             file.Write(uBytes, 0, uBytes.Length);
                             file.Write(uBytes, 0, uBytes.Length);
                             file.Close();
                             file.Close();
+                        } else
+                        {
+                            //删除保存的用户信息
+                            string userFilePath = Environment.GetEnvironmentVariable("systemdrive") + MyConstants.MIND_PWD_PATH;
+                            if(File.Exists(userFilePath))
+                            {
+                                File.Delete(userFilePath);
+                            }
+                        }
+                        if(this.AutoLoginCb.Checked)
+                        {
+                            SetAutoStart();
+                        } else
+                        {
+                            CancelAutoStart();
                         }
                         }
                     }
                     }
                     catch (Exception)
                     catch (Exception)
                     {
                     {
                     }
                     }
-                    new MainForm(this, deviceInfo).Show();
                     this.Visible = false;
                     this.Visible = false;
+                    new MainForm(this, deviceInfo).Show();
                 }
                 }
                 else if (r.Code == MyConstants.CODE_FAIL_500)
                 else if (r.Code == MyConstants.CODE_FAIL_500)
                 {
                 {
@@ -238,7 +286,10 @@ namespace lqnet
 
 
         private void MindPwd_CheckedChanged(object sender, EventArgs e)
         private void MindPwd_CheckedChanged(object sender, EventArgs e)
         {
         {
-
+            if(this.mindPwd.Checked==false)
+            {
+                this.AutoLoginCb.Checked = false;
+            }
         }
         }
 
 
         private void UserName_textBox_TextChanged(object sender, EventArgs e)
         private void UserName_textBox_TextChanged(object sender, EventArgs e)
@@ -289,5 +340,55 @@ namespace lqnet
             }
             }
            
            
         }
         }
+        /// <summary>
+        /// 恢复窗体显示,当启动另外一个实例时,当前实例自动恢复窗体显示
+        /// </summary>
+        public void ReDisplay()
+        {
+            WindowState = FormWindowState.Normal;//还原窗体显示
+            this.Activate();//激活窗体并给予焦点
+            this.ShowInTaskbar = true;//显示任务栏图标
+        }
+
+        private void AutoLoginCb_Change(object sender, EventArgs e)
+        {
+            if(this.AutoLoginCb.Checked)
+            {
+                this.mindPwd.Checked = true;
+            }
+        }
+
+        private void SetAutoStart()
+        {
+            //将当前程序起动路径
+            string path = System.Windows.Forms.Application.ExecutablePath.ToLower();
+            //获得应用程序名称
+            string name = System.Windows.Forms.Application.ExecutablePath;
+            if(!SystemHelper.IsAutoRun(path, name))
+            {
+                SystemHelper.SetAutoRun(path, name, true);
+            }
+        }
+
+        private void CancelAutoStart()
+        {
+            //将当前程序起动路径
+            string path = System.Windows.Forms.Application.ExecutablePath.ToLower();
+            //获得应用程序名称
+            string name = System.Windows.Forms.Application.ExecutablePath;
+            if (SystemHelper.IsAutoRun(path, name))
+            {
+                SystemHelper.SetAutoRun(path, name, false);
+            }
+        }
+
+        private void Login_Shown(object sender, EventArgs e)
+        {
+            if(this.AutoLoginCb.Checked)
+            {
+                //自动登录
+                loginHandler();
+            }
+        }
     }
     }
 }
 }

+ 129 - 87
lqnet/Forms/MainForm.Designer.cs

@@ -52,8 +52,18 @@ namespace lqnet.Forms
         {
         {
             this.components = new System.ComponentModel.Container();
             this.components = new System.ComponentModel.Container();
             System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
             System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
+            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
             this.prodtDesig_sel = new System.Windows.Forms.TextBox();
             this.prodtDesig_sel = new System.Windows.Forms.TextBox();
             this.dataGridView1 = new System.Windows.Forms.DataGridView();
             this.dataGridView1 = new System.Windows.Forms.DataGridView();
+            this.Index = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.idDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.prodtDesigDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.prodtBatchDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.numDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupOrderCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.proceNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupProceIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.groupProceCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
             this.taskListBindingSource = new System.Windows.Forms.BindingSource(this.components);
             this.taskListBindingSource = new System.Windows.Forms.BindingSource(this.components);
             this.CheckItemComboBox = new System.Windows.Forms.ComboBox();
             this.CheckItemComboBox = new System.Windows.Forms.ComboBox();
             this.slectBt = new System.Windows.Forms.Button();
             this.slectBt = new System.Windows.Forms.Button();
@@ -82,15 +92,10 @@ namespace lqnet.Forms
             this.label3 = new System.Windows.Forms.Label();
             this.label3 = new System.Windows.Forms.Label();
             this.label2 = new System.Windows.Forms.Label();
             this.label2 = new System.Windows.Forms.Label();
             this.panel2 = new System.Windows.Forms.Panel();
             this.panel2 = new System.Windows.Forms.Panel();
-            this.Index = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.idDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.prodtDesigDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.prodtBatchDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.numDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupOrderCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.proceNameDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupProceIdDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
-            this.groupProceCodeDataGridViewTextBoxColumn = new System.Windows.Forms.DataGridViewTextBoxColumn();
+            this.notifyIcon1 = new System.Windows.Forms.NotifyIcon(this.components);
+            this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
+            this.退出ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.dataGridView1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.taskListBindingSource)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.taskListBindingSource)).BeginInit();
             this.groupBox1.SuspendLayout();
             this.groupBox1.SuspendLayout();
@@ -100,6 +105,7 @@ namespace lqnet.Forms
             this.groupBox3.SuspendLayout();
             this.groupBox3.SuspendLayout();
             this.panel1.SuspendLayout();
             this.panel1.SuspendLayout();
             this.panel2.SuspendLayout();
             this.panel2.SuspendLayout();
+            this.contextMenuStrip1.SuspendLayout();
             this.SuspendLayout();
             this.SuspendLayout();
             // 
             // 
             // prodtDesig_sel
             // prodtDesig_sel
@@ -141,6 +147,90 @@ namespace lqnet.Forms
             this.dataGridView1.TabIndex = 2;
             this.dataGridView1.TabIndex = 2;
             this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView1_CellClick);
             this.dataGridView1.CellClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.DataGridView1_CellClick);
             // 
             // 
+            // Index
+            // 
+            this.Index.DataPropertyName = "Index";
+            this.Index.HeaderText = "序号";
+            this.Index.MinimumWidth = 10;
+            this.Index.Name = "Index";
+            this.Index.ReadOnly = true;
+            this.Index.Width = 60;
+            // 
+            // idDataGridViewTextBoxColumn
+            // 
+            this.idDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderId";
+            this.idDataGridViewTextBoxColumn.HeaderText = "调度单id";
+            this.idDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
+            this.idDataGridViewTextBoxColumn.ReadOnly = true;
+            this.idDataGridViewTextBoxColumn.Visible = false;
+            this.idDataGridViewTextBoxColumn.Width = 80;
+            // 
+            // prodtDesigDataGridViewTextBoxColumn
+            // 
+            this.prodtDesigDataGridViewTextBoxColumn.DataPropertyName = "ProdtDesig";
+            this.prodtDesigDataGridViewTextBoxColumn.HeaderText = "产品代号";
+            this.prodtDesigDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.prodtDesigDataGridViewTextBoxColumn.Name = "prodtDesigDataGridViewTextBoxColumn";
+            this.prodtDesigDataGridViewTextBoxColumn.ReadOnly = true;
+            this.prodtDesigDataGridViewTextBoxColumn.Width = 120;
+            // 
+            // prodtBatchDataGridViewTextBoxColumn
+            // 
+            this.prodtBatchDataGridViewTextBoxColumn.DataPropertyName = "ProdtBatch";
+            this.prodtBatchDataGridViewTextBoxColumn.HeaderText = "生产批次";
+            this.prodtBatchDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.prodtBatchDataGridViewTextBoxColumn.Name = "prodtBatchDataGridViewTextBoxColumn";
+            this.prodtBatchDataGridViewTextBoxColumn.ReadOnly = true;
+            this.prodtBatchDataGridViewTextBoxColumn.Width = 120;
+            // 
+            // numDataGridViewTextBoxColumn
+            // 
+            this.numDataGridViewTextBoxColumn.DataPropertyName = "PlanAmt";
+            this.numDataGridViewTextBoxColumn.HeaderText = "数量";
+            this.numDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.numDataGridViewTextBoxColumn.Name = "numDataGridViewTextBoxColumn";
+            this.numDataGridViewTextBoxColumn.ReadOnly = true;
+            this.numDataGridViewTextBoxColumn.Width = 80;
+            // 
+            // groupOrderCodeDataGridViewTextBoxColumn
+            // 
+            this.groupOrderCodeDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderCode";
+            this.groupOrderCodeDataGridViewTextBoxColumn.HeaderText = "调度单号";
+            this.groupOrderCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupOrderCodeDataGridViewTextBoxColumn.Name = "groupOrderCodeDataGridViewTextBoxColumn";
+            this.groupOrderCodeDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupOrderCodeDataGridViewTextBoxColumn.Width = 130;
+            // 
+            // proceNameDataGridViewTextBoxColumn
+            // 
+            this.proceNameDataGridViewTextBoxColumn.DataPropertyName = "ProceName";
+            this.proceNameDataGridViewTextBoxColumn.HeaderText = "工序名称";
+            this.proceNameDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.proceNameDataGridViewTextBoxColumn.Name = "proceNameDataGridViewTextBoxColumn";
+            this.proceNameDataGridViewTextBoxColumn.ReadOnly = true;
+            this.proceNameDataGridViewTextBoxColumn.Width = 130;
+            // 
+            // groupProceIdDataGridViewTextBoxColumn
+            // 
+            this.groupProceIdDataGridViewTextBoxColumn.DataPropertyName = "GroupProceId";
+            this.groupProceIdDataGridViewTextBoxColumn.HeaderText = "工序id";
+            this.groupProceIdDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupProceIdDataGridViewTextBoxColumn.Name = "groupProceIdDataGridViewTextBoxColumn";
+            this.groupProceIdDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupProceIdDataGridViewTextBoxColumn.Visible = false;
+            this.groupProceIdDataGridViewTextBoxColumn.Width = 150;
+            // 
+            // groupProceCodeDataGridViewTextBoxColumn
+            // 
+            this.groupProceCodeDataGridViewTextBoxColumn.DataPropertyName = "ProceCode";
+            this.groupProceCodeDataGridViewTextBoxColumn.HeaderText = "工序编号";
+            this.groupProceCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
+            this.groupProceCodeDataGridViewTextBoxColumn.Name = "groupProceCodeDataGridViewTextBoxColumn";
+            this.groupProceCodeDataGridViewTextBoxColumn.ReadOnly = true;
+            this.groupProceCodeDataGridViewTextBoxColumn.Visible = false;
+            this.groupProceCodeDataGridViewTextBoxColumn.Width = 150;
+            // 
             // taskListBindingSource
             // taskListBindingSource
             // 
             // 
             this.taskListBindingSource.DataSource = typeof(lqnet.Entities.Tasks);
             this.taskListBindingSource.DataSource = typeof(lqnet.Entities.Tasks);
@@ -290,7 +380,7 @@ namespace lqnet.Forms
             this.dataGridView2.RowTemplate.Height = 50;
             this.dataGridView2.RowTemplate.Height = 50;
             this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
             this.dataGridView2.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
             this.dataGridView2.ShowCellToolTips = false;
             this.dataGridView2.ShowCellToolTips = false;
-            this.dataGridView2.Size = new System.Drawing.Size(1010, 430);
+            this.dataGridView2.Size = new System.Drawing.Size(1010, 400);
             this.dataGridView2.TabIndex = 34;
             this.dataGridView2.TabIndex = 34;
             // 
             // 
             // indexDataGridViewTextBoxColumn
             // indexDataGridViewTextBoxColumn
@@ -491,89 +581,36 @@ namespace lqnet.Forms
             this.panel2.Size = new System.Drawing.Size(1338, 894);
             this.panel2.Size = new System.Drawing.Size(1338, 894);
             this.panel2.TabIndex = 41;
             this.panel2.TabIndex = 41;
             // 
             // 
-            // Index
+            // notifyIcon1
             // 
             // 
-            this.Index.DataPropertyName = "Index";
-            this.Index.HeaderText = "序号";
-            this.Index.MinimumWidth = 10;
-            this.Index.Name = "Index";
-            this.Index.ReadOnly = true;
-            this.Index.Width = 60;
+            this.notifyIcon1.ContextMenuStrip = this.contextMenuStrip1;
+            this.notifyIcon1.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon1.Icon")));
+            this.notifyIcon1.Text = "非标上传同步软件";
+            this.notifyIcon1.Visible = true;
+            this.notifyIcon1.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.NotifyIcon1_DClick);
             // 
             // 
-            // idDataGridViewTextBoxColumn
+            // contextMenuStrip1
             // 
             // 
-            this.idDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderId";
-            this.idDataGridViewTextBoxColumn.HeaderText = "调度单id";
-            this.idDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.idDataGridViewTextBoxColumn.Name = "idDataGridViewTextBoxColumn";
-            this.idDataGridViewTextBoxColumn.ReadOnly = true;
-            this.idDataGridViewTextBoxColumn.Visible = false;
-            this.idDataGridViewTextBoxColumn.Width = 80;
-            // 
-            // prodtDesigDataGridViewTextBoxColumn
-            // 
-            this.prodtDesigDataGridViewTextBoxColumn.DataPropertyName = "ProdtDesig";
-            this.prodtDesigDataGridViewTextBoxColumn.HeaderText = "产品代号";
-            this.prodtDesigDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.prodtDesigDataGridViewTextBoxColumn.Name = "prodtDesigDataGridViewTextBoxColumn";
-            this.prodtDesigDataGridViewTextBoxColumn.ReadOnly = true;
-            this.prodtDesigDataGridViewTextBoxColumn.Width = 120;
+            this.contextMenuStrip1.ImageScalingSize = new System.Drawing.Size(24, 24);
+            this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolStripMenuItem1,
+            this.退出ToolStripMenuItem});
+            this.contextMenuStrip1.Name = "contextMenuStrip1";
+            this.contextMenuStrip1.Size = new System.Drawing.Size(117, 64);
             // 
             // 
-            // prodtBatchDataGridViewTextBoxColumn
+            // toolStripMenuItem1
             // 
             // 
-            this.prodtBatchDataGridViewTextBoxColumn.DataPropertyName = "ProdtBatch";
-            this.prodtBatchDataGridViewTextBoxColumn.HeaderText = "生产批次";
-            this.prodtBatchDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.prodtBatchDataGridViewTextBoxColumn.Name = "prodtBatchDataGridViewTextBoxColumn";
-            this.prodtBatchDataGridViewTextBoxColumn.ReadOnly = true;
-            this.prodtBatchDataGridViewTextBoxColumn.Width = 120;
+            this.toolStripMenuItem1.Name = "toolStripMenuItem1";
+            this.toolStripMenuItem1.Size = new System.Drawing.Size(116, 30);
+            this.toolStripMenuItem1.Text = "还原";
+            this.toolStripMenuItem1.Click += new System.EventHandler(this.Main_ReNormal_Click);
             // 
             // 
-            // numDataGridViewTextBoxColumn
+            // 退出ToolStripMenuItem
             // 
             // 
-            this.numDataGridViewTextBoxColumn.DataPropertyName = "PlanAmt";
-            this.numDataGridViewTextBoxColumn.HeaderText = "数量";
-            this.numDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.numDataGridViewTextBoxColumn.Name = "numDataGridViewTextBoxColumn";
-            this.numDataGridViewTextBoxColumn.ReadOnly = true;
-            this.numDataGridViewTextBoxColumn.Width = 80;
-            // 
-            // groupOrderCodeDataGridViewTextBoxColumn
-            // 
-            this.groupOrderCodeDataGridViewTextBoxColumn.DataPropertyName = "GroupOrderCode";
-            this.groupOrderCodeDataGridViewTextBoxColumn.HeaderText = "调度单号";
-            this.groupOrderCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupOrderCodeDataGridViewTextBoxColumn.Name = "groupOrderCodeDataGridViewTextBoxColumn";
-            this.groupOrderCodeDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupOrderCodeDataGridViewTextBoxColumn.Width = 130;
-            // 
-            // proceNameDataGridViewTextBoxColumn
-            // 
-            this.proceNameDataGridViewTextBoxColumn.DataPropertyName = "ProceName";
-            this.proceNameDataGridViewTextBoxColumn.HeaderText = "工序名称";
-            this.proceNameDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.proceNameDataGridViewTextBoxColumn.Name = "proceNameDataGridViewTextBoxColumn";
-            this.proceNameDataGridViewTextBoxColumn.ReadOnly = true;
-            this.proceNameDataGridViewTextBoxColumn.Width = 130;
-            // 
-            // groupProceIdDataGridViewTextBoxColumn
-            // 
-            this.groupProceIdDataGridViewTextBoxColumn.DataPropertyName = "GroupProceId";
-            this.groupProceIdDataGridViewTextBoxColumn.HeaderText = "工序id";
-            this.groupProceIdDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupProceIdDataGridViewTextBoxColumn.Name = "groupProceIdDataGridViewTextBoxColumn";
-            this.groupProceIdDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupProceIdDataGridViewTextBoxColumn.Visible = false;
-            this.groupProceIdDataGridViewTextBoxColumn.Width = 150;
-            // 
-            // groupProceCodeDataGridViewTextBoxColumn
-            // 
-            this.groupProceCodeDataGridViewTextBoxColumn.DataPropertyName = "ProceCode";
-            this.groupProceCodeDataGridViewTextBoxColumn.HeaderText = "工序编号";
-            this.groupProceCodeDataGridViewTextBoxColumn.MinimumWidth = 10;
-            this.groupProceCodeDataGridViewTextBoxColumn.Name = "groupProceCodeDataGridViewTextBoxColumn";
-            this.groupProceCodeDataGridViewTextBoxColumn.ReadOnly = true;
-            this.groupProceCodeDataGridViewTextBoxColumn.Visible = false;
-            this.groupProceCodeDataGridViewTextBoxColumn.Width = 150;
+            this.退出ToolStripMenuItem.Name = "退出ToolStripMenuItem";
+            this.退出ToolStripMenuItem.Size = new System.Drawing.Size(116, 30);
+            this.退出ToolStripMenuItem.Text = "退出";
+            this.退出ToolStripMenuItem.Click += new System.EventHandler(this.Main_Close_Click);
             // 
             // 
             // MainForm
             // MainForm
             // 
             // 
@@ -586,10 +623,10 @@ namespace lqnet.Forms
             this.Icon = global::lqnet.Properties.Resources.favicon;
             this.Icon = global::lqnet.Properties.Resources.favicon;
             this.MaximizeBox = false;
             this.MaximizeBox = false;
             this.MaximumSize = new System.Drawing.Size(1360, 950);
             this.MaximumSize = new System.Drawing.Size(1360, 950);
-            this.MinimizeBox = false;
             this.Name = "MainForm";
             this.Name = "MainForm";
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
             this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
             this.Text = "TDM测试台数据传输终端";
             this.Text = "TDM测试台数据传输终端";
+            this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
             this.Load += new System.EventHandler(this.Main_Load);
             this.Load += new System.EventHandler(this.Main_Load);
             this.Shown += new System.EventHandler(this.MainForm_Shown);
             this.Shown += new System.EventHandler(this.MainForm_Shown);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
             this.Paint += new System.Windows.Forms.PaintEventHandler(this.Boder_Paint);
@@ -605,6 +642,7 @@ namespace lqnet.Forms
             this.panel1.ResumeLayout(false);
             this.panel1.ResumeLayout(false);
             this.panel1.PerformLayout();
             this.panel1.PerformLayout();
             this.panel2.ResumeLayout(false);
             this.panel2.ResumeLayout(false);
+            this.contextMenuStrip1.ResumeLayout(false);
             this.ResumeLayout(false);
             this.ResumeLayout(false);
 
 
         }
         }
@@ -649,5 +687,9 @@ namespace lqnet.Forms
         private DataGridViewTextBoxColumn proceNameDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn proceNameDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceIdDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceIdDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceCodeDataGridViewTextBoxColumn;
         private DataGridViewTextBoxColumn groupProceCodeDataGridViewTextBoxColumn;
+        private NotifyIcon notifyIcon1;
+        private ContextMenuStrip contextMenuStrip1;
+        private ToolStripMenuItem toolStripMenuItem1;
+        private ToolStripMenuItem 退出ToolStripMenuItem;
     }
     }
 }
 }

+ 65 - 1
lqnet/Forms/MainForm.cs

@@ -19,6 +19,7 @@ using lqnet.Utils;
 using Microsoft.VisualBasic.Devices;
 using Microsoft.VisualBasic.Devices;
 using Newtonsoft.Json;
 using Newtonsoft.Json;
 using Org.BouncyCastle.Pqc.Crypto.Lms;
 using Org.BouncyCastle.Pqc.Crypto.Lms;
+using static System.Windows.Forms.VisualStyles.VisualStyleElement.ProgressBar;
 
 
 namespace lqnet.Forms
 namespace lqnet.Forms
 {
 {
@@ -121,6 +122,7 @@ namespace lqnet.Forms
                 reloadDeviceConfig();
                 reloadDeviceConfig();
                 startSendbeat();
                 startSendbeat();
             }
             }
+            this.Text = this.Text + "  当前登录设备:" + this._device.equitName;
             //try
             //try
             //{
             //{
             //    string imgPath = System.Windows.Forms.Application.StartupPath + MyConstants.BACKGROUDIMG_NAME;
             //    string imgPath = System.Windows.Forms.Application.StartupPath + MyConstants.BACKGROUDIMG_NAME;
@@ -132,7 +134,7 @@ namespace lqnet.Forms
             //    this.BackColor = MyConstants.BACKGROUDIMG_COLOR;
             //    this.BackColor = MyConstants.BACKGROUDIMG_COLOR;
             //    //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
             //    //MessageBox.Show("未找到背景图片资源,建议重新安装修复终端,避免影响使用观感", "初始化提示", MessageBoxButtons.OK);
             //}
             //}
-
+            VariablesGlobal.currentForm = this;
         }
         }
 
 
         private void NumberTextBox_KeyPress(object sender, KeyPressEventArgs e)
         private void NumberTextBox_KeyPress(object sender, KeyPressEventArgs e)
@@ -431,6 +433,21 @@ namespace lqnet.Forms
             SelectTaskList();
             SelectTaskList();
         }
         }
 
 
+        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
+        {
+            // 注意判断关闭事件reason来源于窗体按钮,否则用菜单退出时无法退出!
+            if (e.CloseReason == CloseReason.UserClosing)
+            {
+                //取消"关闭窗口"事件
+                e.Cancel = true; // 取消关闭窗体
+                //使关闭时窗口向右下角缩小的效果
+                this.WindowState = FormWindowState.Minimized;
+                this.notifyIcon1.Visible = true;
+                this.Hide();
+                return;
+            }
+        }
+
         /// <summary>
         /// <summary>
         /// 搜索任务
         /// 搜索任务
         /// </summary>
         /// </summary>
@@ -667,6 +684,7 @@ namespace lqnet.Forms
                 return;
                 return;
             }
             }
             this.ParentFormLogin.Visible = true;
             this.ParentFormLogin.Visible = true;
+            VariablesGlobal.currentForm = this.ParentFormLogin;
             this.DisposeParentFormIs = false;
             this.DisposeParentFormIs = false;
             VariablesGlobal.USER_TOKEN = null;
             VariablesGlobal.USER_TOKEN = null;
             this.Dispose();
             this.Dispose();
@@ -1013,5 +1031,51 @@ namespace lqnet.Forms
 
 
             this.Location = new Point(left, top);
             this.Location = new Point(left, top);
         }
         }
+
+        /// <summary>
+        /// 恢复窗体显示,当启动另外一个实例时,当前实例自动恢复窗体显示
+        /// </summary>
+        public void ReDisplay()
+        {
+            this.Visible = true;
+            WindowState = FormWindowState.Normal;//还原窗体显示
+            this.ShowInTaskbar = true;//显示任务栏图标
+            this.notifyIcon1.Visible = true;//托盘图标隐藏
+            this.Activate();//激活窗体并给予焦点
+        }
+
+        private void Main_ReNormal_Click(object sender, EventArgs e)
+        {
+            this.Visible = true;
+            this.WindowState = FormWindowState.Normal;
+            this.ShowInTaskbar = true;//显示任务栏图标
+            this.notifyIcon1.Visible = true;
+            this.Activate();
+        }
+
+        private void Main_Close_Click(object sender, EventArgs e)
+        {
+            this.notifyIcon1.Visible = false;
+            VariablesGlobal.currentForm = null;
+            this.Close();
+            this.Dispose();
+            System.Environment.Exit(System.Environment.ExitCode);
+        }
+
+        private void NotifyIcon1_DClick(object sender, MouseEventArgs e)
+        {
+            if (this.Visible)
+            {
+                this.WindowState = FormWindowState.Minimized;
+                this.notifyIcon1.Visible = true;
+                this.Hide();
+            }
+            else
+            {
+                this.Visible = true;
+                this.WindowState = FormWindowState.Normal;
+                this.Activate();
+            }
+        }
     }
     }
 }
 }

+ 416 - 0
lqnet/Forms/MainForm.resx

@@ -126,4 +126,420 @@
   <metadata name="reportColListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
   <metadata name="reportColListBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
     <value>17, 17</value>
     <value>17, 17</value>
   </metadata>
   </metadata>
+  <metadata name="notifyIcon1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>574, 21</value>
+  </metadata>
+  <metadata name="contextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>736, 21</value>
+  </metadata>
+  <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+  <data name="notifyIcon1.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        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
+</value>
+  </data>
 </root>
 </root>

+ 5 - 1
lqnet/Lqnet.csproj

@@ -58,7 +58,7 @@
     <ManifestKeyFile>Lqnet_TemporaryKey.pfx</ManifestKeyFile>
     <ManifestKeyFile>Lqnet_TemporaryKey.pfx</ManifestKeyFile>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup>
   <PropertyGroup>
-    <GenerateManifests>true</GenerateManifests>
+    <GenerateManifests>false</GenerateManifests>
   </PropertyGroup>
   </PropertyGroup>
   <PropertyGroup>
   <PropertyGroup>
     <SignManifests>false</SignManifests>
     <SignManifests>false</SignManifests>
@@ -69,6 +69,9 @@
   <PropertyGroup>
   <PropertyGroup>
     <ApplicationIcon>icon.ico</ApplicationIcon>
     <ApplicationIcon>icon.ico</ApplicationIcon>
   </PropertyGroup>
   </PropertyGroup>
+  <PropertyGroup>
+    <TargetZone>LocalIntranet</TargetZone>
+  </PropertyGroup>
   <ItemGroup>
   <ItemGroup>
     <Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
     <Reference Include="BouncyCastle.Cryptography, Version=2.0.0.0, Culture=neutral, PublicKeyToken=072edcf4a5328938, processorArchitecture=MSIL">
       <HintPath>..\packages\BouncyCastle.Cryptography.2.2.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
       <HintPath>..\packages\BouncyCastle.Cryptography.2.2.1\lib\net461\BouncyCastle.Cryptography.dll</HintPath>
@@ -216,6 +219,7 @@
     <Compile Include="Utils\PageHelper.Designer.cs">
     <Compile Include="Utils\PageHelper.Designer.cs">
       <DependentUpon>PageHelper.cs</DependentUpon>
       <DependentUpon>PageHelper.cs</DependentUpon>
     </Compile>
     </Compile>
+    <Compile Include="Utils\SystemHelper.cs" />
     <EmbeddedResource Include="Forms\DevicePopupForm.resx">
     <EmbeddedResource Include="Forms\DevicePopupForm.resx">
       <DependentUpon>DevicePopupForm.cs</DependentUpon>
       <DependentUpon>DevicePopupForm.cs</DependentUpon>
     </EmbeddedResource>
     </EmbeddedResource>

+ 4 - 3
lqnet/Properties/AssemblyInfo.cs

@@ -1,4 +1,5 @@
-using System.Reflection;
+using System.Diagnostics;
+using System.Reflection;
 using System.Runtime.InteropServices;
 using System.Runtime.InteropServices;
 
 
 // 有关程序集的一般信息由以下
 // 有关程序集的一般信息由以下
@@ -31,5 +32,5 @@ using System.Runtime.InteropServices;
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 // 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
 // 方法是按如下所示使用“*”: :
 // 方法是按如下所示使用“*”: :
 // [assembly: AssemblyVersion("1.0.*")]
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.12")]
-[assembly: AssemblyFileVersion("1.0.0.12")]
+[assembly: AssemblyVersion("1.0.0.16")]
+[assembly: AssemblyFileVersion("1.0.0.16")]

+ 35 - 9
lqnet/Utils/ExcelHelper.cs

@@ -8,11 +8,13 @@ using NPOI.SS.Util;
 using NPOI.XSSF.Streaming;
 using NPOI.XSSF.Streaming;
 using NPOI.XSSF.UserModel;
 using NPOI.XSSF.UserModel;
 using System;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Collections.Generic;
 using System.IO;
 using System.IO;
 using System.Linq;
 using System.Linq;
 using System.Security.Cryptography.X509Certificates;
 using System.Security.Cryptography.X509Certificates;
 using System.Text;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
 namespace lqnet.Utils
 namespace lqnet.Utils
@@ -22,6 +24,11 @@ namespace lqnet.Utils
     /// </summary>
     /// </summary>
     public static class ExcelHelper
     public static class ExcelHelper
     {
     {
+        private static ConcurrentDictionary<int, List<CellRangeAddress>> _rowCellRangeList = new ConcurrentDictionary<int, List<CellRangeAddress>>();
+        /// <summary>
+        /// 锁对象
+        /// </summary>
+        private static Mutex mutex = new Mutex();
         /// <summary>
         /// <summary>
         /// 读取传入的报告内容
         /// 读取传入的报告内容
         /// </summary>
         /// </summary>
@@ -30,6 +37,18 @@ namespace lqnet.Utils
         /// <param name="rowSpan">产品跨行数</param>
         /// <param name="rowSpan">产品跨行数</param>
         public static List<ReportCol> readRport(string filePath, string prodtStartIndx, int rowSpan)
         public static List<ReportCol> readRport(string filePath, string prodtStartIndx, int rowSpan)
         {
         {
+            try
+            {
+                mutex.WaitOne();
+                return parseReport(filePath, prodtStartIndx, rowSpan);
+            } finally { 
+                mutex.ReleaseMutex();
+            }
+        }
+
+        private static List<ReportCol> parseReport(string filePath, string prodtStartIndx, int rowSpan)
+        {
+            _rowCellRangeList.Clear();
             if (!File.Exists(filePath))
             if (!File.Exists(filePath))
             {
             {
                 //文件不存在直接返回空
                 //文件不存在直接返回空
@@ -45,7 +64,8 @@ namespace lqnet.Utils
                     XSSFWorkbook excelWorkbook = new XSSFWorkbook(filestream);
                     XSSFWorkbook excelWorkbook = new XSSFWorkbook(filestream);
                     SXSSFWorkbook workbook = new SXSSFWorkbook(excelWorkbook, 100);
                     SXSSFWorkbook workbook = new SXSSFWorkbook(excelWorkbook, 100);
                     sheet = workbook.XssfWorkbook.GetSheetAt(0);
                     sheet = workbook.XssfWorkbook.GetSheetAt(0);
-                } else
+                }
+                else
                 {
                 {
                     HSSFWorkbook workbook = new HSSFWorkbook(filestream);
                     HSSFWorkbook workbook = new HSSFWorkbook(filestream);
                     sheet = workbook.GetSheetAt(0);
                     sheet = workbook.GetSheetAt(0);
@@ -53,21 +73,21 @@ namespace lqnet.Utils
                 var index = prodtStartIndx.IndexOfAny("0123456789".ToCharArray());
                 var index = prodtStartIndx.IndexOfAny("0123456789".ToCharArray());
                 int prodStartRow = int.Parse(prodtStartIndx.Split(',')[0].Substring(index));
                 int prodStartRow = int.Parse(prodtStartIndx.Split(',')[0].Substring(index));
                 int startRow = prodStartRow - 1;
                 int startRow = prodStartRow - 1;
-                int endRow = prodStartRow + (rowSpan>1? rowSpan-1: 0);
+                int endRow = prodStartRow + (rowSpan > 1 ? rowSpan - 1 : 0);
 
 
                 string startColLabel = prodtStartIndx.Substring(0, index);
                 string startColLabel = prodtStartIndx.Substring(0, index);
                 byte[] array = System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(startColLabel.Length - 1));
                 byte[] array = System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(startColLabel.Length - 1));
                 //计算开始列位置
                 //计算开始列位置
-                int startCol = ((int)array[0]) - 65 + (26 * ((startColLabel.Length > 1 ? ((int)System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(0, 1))[0]-65+startColLabel.Length-1) :startColLabel.Length - 1)));
+                int startCol = ((int)array[0]) - 65 + (26 * ((startColLabel.Length > 1 ? ((int)System.Text.Encoding.ASCII.GetBytes(startColLabel.Substring(0, 1))[0] - 65 + startColLabel.Length - 1) : startColLabel.Length - 1)));
                 //读一行得每一列
                 //读一行得每一列
                 List<ReportCol> data = new List<ReportCol>();
                 List<ReportCol> data = new List<ReportCol>();
-                for(int i = startRow; i < endRow; i++)
+                for (int i = startRow; i < endRow; i++)
                 {
                 {
                     int col = startCol + 1;
                     int col = startCol + 1;
                     do
                     do
                     {
                     {
                         string label = GetCellReference(sheet, i, col);
                         string label = GetCellReference(sheet, i, col);
-                        if(!string.IsNullOrEmpty(label))
+                        if (!string.IsNullOrEmpty(label))
                         {
                         {
                             ReportCol reportCol = new ReportCol();
                             ReportCol reportCol = new ReportCol();
                             //获取单元格的cell label
                             //获取单元格的cell label
@@ -80,8 +100,8 @@ namespace lqnet.Utils
                 }
                 }
                 return data;
                 return data;
             }
             }
-
         }
         }
+
         /// <summary>
         /// <summary>
         /// 获取cell坐标
         /// 获取cell坐标
         /// </summary>
         /// </summary>
@@ -105,10 +125,16 @@ namespace lqnet.Utils
         private static string getMergeCellReference(ISheet sheet, int row, int col)
         private static string getMergeCellReference(ISheet sheet, int row, int col)
         {
         {
             int regionsCount = sheet.NumMergedRegions;
             int regionsCount = sheet.NumMergedRegions;
-            for (int i = 0; i < regionsCount; i++)
+            List<CellRangeAddress> rowList = _rowCellRangeList.ContainsKey(row)? _rowCellRangeList[row]:null;
+            if(rowList == null || rowList.Count == 0)
+            {
+                rowList = sheet.MergedRegions.Where(item => item.FirstRow == row).ToList();
+                _rowCellRangeList[row] = rowList;
+            }
+            if(rowList !=null && rowList.Count > 0)
             {
             {
-                CellRangeAddress range = sheet.GetMergedRegion(i);
-                if (sheet.IsMergedRegion(range) && range.FirstRow == row && range.FirstColumn == col)
+                CellRangeAddress range = rowList.Where(item => item.FirstRow == row && item.FirstColumn == col).FirstOrDefault();
+                if (range != null && sheet.IsMergedRegion(range))
                 {
                 {
                     return range.FormatAsString();
                     return range.FormatAsString();
                 }
                 }

+ 85 - 0
lqnet/Utils/SystemHelper.cs

@@ -0,0 +1,85 @@
+using lqnet.Entities;
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace lqnet.Utils
+{
+    public sealed class SystemHelper
+    {
+        private SystemHelper() { }
+
+        /// <summary>
+        /// 设置程序开机启动
+        /// </summary>
+        /// <param name="strAppPath">应用程序exe所在文件夹</param>
+        /// <param name="strAppName">应用程序exe名称</param>
+        /// <param name="bIsAutoRun">自动运行状态</param>
+        public static void SetAutoRun(string strAppPath, string strAppName, bool bIsAutoRun)
+        {
+            try
+            {
+                if (string.IsNullOrWhiteSpace(strAppPath)
+                    || string.IsNullOrWhiteSpace(strAppName))
+                {
+                    throw new Exception("应用程序路径或名称为空!");
+                }
+
+                RegistryKey reg = Registry.LocalMachine;
+                RegistryKey run = reg.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
+
+                if (bIsAutoRun)
+                {
+                    run.SetValue(strAppName, strAppPath);
+                }
+                else
+                {
+                    if (null != run.GetValue(strAppName))
+                    {
+                        run.DeleteValue(strAppName);
+                    }
+                }
+
+                run.Close();
+                reg.Close();
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("设置或者取消开机启动失败,失败原因:" + ex.Message, "提示", MessageBoxButtons.OK);
+            }
+        }
+
+        /// <summary>
+        /// 判断是否开机启动
+        /// </summary>
+        /// <param name="strAppPath">应用程序路径</param>
+        /// <param name="strAppName">应用程序名称</param>
+        /// <returns></returns>
+        public static bool IsAutoRun(string strAppPath, string strAppName)
+        {
+            try
+            {
+                RegistryKey reg = Registry.LocalMachine;
+                RegistryKey software = reg.OpenSubKey(@"SOFTWARE");
+                RegistryKey run = reg.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
+                object key = run.GetValue(strAppName);
+                software.Close();
+                run.Close();
+                if (null == key || !strAppPath.Equals(key.ToString()))
+                {
+                    return false;
+                }
+                return true;
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show("读取开机启动状态失败,失败原因:" + ex.Message, "提示", MessageBoxButtons.OK);
+            }
+            return false;
+        }
+    }
+}

+ 18 - 18
lqnet/app.config

@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup>
   <runtime>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0"/>
+        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1"/>
+        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11"/>
+        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11" />
       </dependentAssembly>
       </dependentAssembly>
     </assemblyBinding>
     </assemblyBinding>
   </runtime>
   </runtime>

+ 7 - 14
lqnet/app.manifest

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
 <assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
-  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
+  <assemblyIdentity version="1.0.0.0" name="MyApplication.app" />
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
     <security>
     <security>
       <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
@@ -15,46 +15,40 @@
             如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
             如果你的应用程序需要此虚拟化来实现向后兼容性,则删除此
             元素。
             元素。
         -->
         -->
-        <requestedExecutionLevel level="asInvoker" uiAccess="false" />
+		  <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
       </requestedPrivileges>
       </requestedPrivileges>
+      <applicationRequestMinimum>
+        <PermissionSet Unrestricted="true" ID="Custom" SameSite="site" />
+        <defaultAssemblyRequest permissionSetReference="Custom" />
+      </applicationRequestMinimum>
     </security>
     </security>
   </trustInfo>
   </trustInfo>
-
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
   <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
     <application>
     <application>
       <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
       <!-- 设计此应用程序与其一起工作且已针对此应用程序进行测试的
            Windows 版本的列表。取消评论适当的元素,
            Windows 版本的列表。取消评论适当的元素,
            Windows 将自动选择最兼容的环境。 -->
            Windows 将自动选择最兼容的环境。 -->
-
       <!-- Windows Vista -->
       <!-- Windows Vista -->
       <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
       <!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
-
       <!-- Windows 7 -->
       <!-- Windows 7 -->
       <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
       <!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
-
       <!-- Windows 8 -->
       <!-- Windows 8 -->
       <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
       <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
-
       <!-- Windows 8.1 -->
       <!-- Windows 8.1 -->
       <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
       <!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
-
       <!-- Windows 10 -->
       <!-- Windows 10 -->
       <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
       <!--<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />-->
-
     </application>
     </application>
   </compatibility>
   </compatibility>
-
   <!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
   <!-- 指示该应用程序可以感知 DPI 且 Windows 在 DPI 较高时将不会对其进行
        自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
        自动缩放。Windows Presentation Foundation (WPF)应用程序自动感知 DPI,无需
        选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
        选择加入。选择加入此设置的 Windows 窗体应用程序(目标设定为 .NET Framework 4.6 )还应
        在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
        在其 app.config 中将 "EnableWindowsFormsHighDpiAutoResizing" 设置设置为 "true"。-->
-
   <application xmlns="urn:schemas-microsoft-com:asm.v3">
   <application xmlns="urn:schemas-microsoft-com:asm.v3">
     <windowsSettings>
     <windowsSettings>
       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
       <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
     </windowsSettings>
     </windowsSettings>
   </application>
   </application>
-
   <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
   <!-- 启用 Windows 公共控件和对话框的主题(Windows XP 和更高版本) -->
   <!--
   <!--
   <dependency>
   <dependency>
@@ -70,5 +64,4 @@
     </dependentAssembly>
     </dependentAssembly>
   </dependency>
   </dependency>
   -->
   -->
-
-</assembly>
+</assembly>

BIN
lqnet/bin/Debug/app.publish/lqnet.exe


File diff suppressed because it is too large
+ 0 - 21
lqnet/bin/Debug/lqnet.application


BIN
lqnet/bin/Debug/lqnet.exe


+ 18 - 18
lqnet/bin/Debug/lqnet.exe.config

@@ -1,39 +1,39 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
 <configuration>
 <configuration>
-<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/></startup>
+<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2" /></startup>
   <runtime>
   <runtime>
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0"/>
+        <assemblyIdentity name="MathNet.Numerics" publicKeyToken="cd8b63ad3d691a37" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.10.0.0" newVersion="4.10.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
+        <assemblyIdentity name="System.Text.Encoding.CodePages" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1"/>
+        <assemblyIdentity name="System.Security.Cryptography.Xml" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-6.0.0.1" newVersion="6.0.0.1" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2"/>
+        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.1.2" newVersion="4.0.1.2" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0"/>
+        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
+        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
       </dependentAssembly>
       </dependentAssembly>
       <dependentAssembly>
       <dependentAssembly>
-        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral"/>
-        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11"/>
+        <assemblyIdentity name="ICSharpCode.SharpZipLib" publicKeyToken="1b03e6acf1164f73" culture="neutral" />
+        <bindingRedirect oldVersion="0.0.0.0-1.3.3.11" newVersion="1.3.3.11" />
       </dependentAssembly>
       </dependentAssembly>
     </assemblyBinding>
     </assemblyBinding>
   </runtime>
   </runtime>

File diff suppressed because it is too large
+ 0 - 1521
lqnet/bin/Debug/lqnet.exe.manifest


BIN
lqnet/bin/Debug/lqnet.pdb


+ 1 - 1
lqnet/lqnet.csproj.user

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
   <PropertyGroup>
-    <PublishUrlHistory>publish\</PublishUrlHistory>
+    <PublishUrlHistory>G:\lqnet\publish\|publish\</PublishUrlHistory>
     <InstallUrlHistory />
     <InstallUrlHistory />
     <SupportUrlHistory />
     <SupportUrlHistory />
     <UpdateUrlHistory />
     <UpdateUrlHistory />

BIN
lqnet/obj/Debug/DesignTimeResolveAssemblyReferences.cache


BIN
lqnet/obj/Debug/DesignTimeResolveAssemblyReferencesInput.cache


+ 1 - 1
lqnet/obj/Debug/Lqnet.csproj.CoreCompileInputs.cache

@@ -1 +1 @@
-35fe29d3e990e929809fad03ba6bd03584a6c2b7
+c1268fa35a1cb7cdfd1cb1e0290364ef4a7b65e5

+ 0 - 4
lqnet/obj/Debug/Lqnet.csproj.FileListAbsolute.txt

@@ -169,8 +169,6 @@ F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\NPOI.Core.dll
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\NPOI.Core.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\NPOI.Core.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\SixLabors.Fonts.xml
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\SixLabors.Fonts.xml
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe.config
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe.config
-F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe.manifest
-F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.application
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\lqnet.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\System.Runtime.InteropServices.RuntimeInformation.dll
 F:\c_work\非标数据集成接口\lqnet\lqnet\bin\Debug\System.Runtime.InteropServices.RuntimeInformation.dll
@@ -326,8 +324,6 @@ F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.Utils.PageHelper2
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.Utils.PageHelper.resources
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.Utils.PageHelper.resources
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.GenerateResource.cache
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.GenerateResource.cache
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CoreCompileInputs.cache
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CoreCompileInputs.cache
-F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.exe.manifest
-F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.application
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CopyComplete
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\Lqnet.csproj.CopyComplete
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.exe
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.pdb
 F:\c_work\非标数据集成接口\lqnet\lqnet\obj\Debug\lqnet.pdb

BIN
lqnet/obj/Debug/Lqnet.csproj.GenerateResource.cache


BIN
lqnet/obj/Debug/lqnet.Forms.MainForm.resources


File diff suppressed because it is too large
+ 0 - 21
lqnet/obj/Debug/lqnet.application


BIN
lqnet/obj/Debug/lqnet.exe


File diff suppressed because it is too large
+ 0 - 1521
lqnet/obj/Debug/lqnet.exe.manifest


BIN
lqnet/obj/Debug/lqnet.pdb


+ 1 - 0
lqnet/packages.config

@@ -4,6 +4,7 @@
   <package id="Enums.NET" version="4.0.1" targetFramework="net48" />
   <package id="Enums.NET" version="4.0.1" targetFramework="net48" />
   <package id="MathNet.Numerics.Signed" version="4.15.0" targetFramework="net462" />
   <package id="MathNet.Numerics.Signed" version="4.15.0" targetFramework="net462" />
   <package id="Microsoft.IO.RecyclableMemoryStream" version="2.3.2" targetFramework="net48" />
   <package id="Microsoft.IO.RecyclableMemoryStream" version="2.3.2" targetFramework="net48" />
+  <package id="Microsoft.VisualBasic" version="10.3.0" targetFramework="net462" />
   <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net40" requireReinstallation="true" />
   <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net40" requireReinstallation="true" />
   <package id="NPOI" version="2.6.1" targetFramework="net462" />
   <package id="NPOI" version="2.6.1" targetFramework="net462" />
   <package id="SharpZipLib" version="1.3.3" targetFramework="net48" />
   <package id="SharpZipLib" version="1.3.3" targetFramework="net48" />