using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using WeifenLuo.WinFormsUI.Docking; using XKRS.Common.Factory; using XKRS.Common.Interface; using XKRS.Common.Model.Helper; using XKRS.UI.Model.Winform; using XKRS.UI.Model.Winform.Helper; namespace XKRS.UI.Main { public partial class MainFrm : Form { IProcess _process = null; System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.Process processB = new System.Diagnostics.Process(); System.Diagnostics.Process processC = new System.Diagnostics.Process(); public MainFrm() { InitializeComponent(); System.Diagnostics.Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.RealTime; var theme = new VS2015LightTheme(); stsStripLayout.BackColor = ststripDevices.BackColor = Color.FromArgb(64, 64, 64); dockPanelMain.Theme = theme; VisualStudioToolStripExtender extender = new VisualStudioToolStripExtender(); extender.SetStyle(menuMain, VisualStudioToolStripExtender.VsVersion.Vs2015, theme); InitialMenu(MenuFormFactory.MenuFrmTypeDict, ""); m_deserializeMenuFrm = new DeserializeDockContent(GetMenuFromPersistString); m_deserializeDeviceRunFrm = new DeserializeDockContent(GetAllFormPersistString); notifyIcon.Text = SettingHelper.GetProgramDescription(); string iconPath = SettingHelper.GetProgramIcon(); if (!string.IsNullOrWhiteSpace(iconPath)) { notifyIcon.Icon = Icon = new Icon(iconPath); } } private void RegisterEvent(MenuFormBase dockFrm) { dockFrm.OnUploadProcess = DockFrm_OnUploadProcess; } #region Menu readonly ManualResetEvent _allMenuLoadDoneHandle = new ManualResetEvent(false); private void InitialMenu(Dictionary menuFrmTypeDict, string parentMenuCode) { menuFrmTypeDict.Keys.Where(u => u.ParentMenuCode == parentMenuCode).OrderBy(m => m.MenuOrder).ToList().ForEach(m => { ToolStripMenuItem item = new ToolStripMenuItem(m.MenuName); item.Tag = m.MenuCode; if (m.IsActualForm) { item.Click += MenuFormItem_Click; } }); } private async void DockFrm_OnUploadProcess(string frmId, IProcess process) { await Task.Run(() => { _allMenuLoadDoneHandle.WaitOne();//阻止当前线程,直到WaitHandle接收到信号 this.Invoke(new Action(() => { _process = process; CloseAllDeviceFrm(); try { foreach (var dock in dockPanelMain.Contents) { MenuFormBase m = dock as MenuFormBase; if (m != null && m.Id != frmId) { m.DownloadProcess(process); } } } catch (Exception ex) { throw ex; } })); }); } private void MenuFormItem_Click(object sender, EventArgs e) { try { SuspendLayout(); ToolStripMenuItem item = sender as ToolStripMenuItem; bool isExisted = false; foreach (var dock in dockPanelMain.Contents) { MenuFormBase menu = dock as MenuFormBase; if (menu != null && menu.Tag.ToString() == item.Tag.ToString()) { if (menu.IsHidden) { menu.Show(); } menu.BringToFront(); isExisted = true; break; } } if (isExisted) { ResumeLayout(); return; } MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(item.Tag.ToString()); if (dockFrm == null) { return; } dockFrm.Text = item.Text; dockFrm.DockPanel = dockPanelMain; dockFrm.SetLoginStatus(IsLogin); dockFrm.DockStateChanged += DockStateChanged; dockFrm.Show(); RegisterEvent(dockFrm); ResumeLayout(); } catch { } } #endregion private void MainFrm_Load(object sender, EventArgs e) { LoadLayoutFromXML(m_deserializeMenuFrm); _allMenuLoadDoneHandle.Set(); AdvancedPwdFrm.OnLoginOK = OnLoginOK; LoadProcess(); LoadLayoutFromXML(m_deserializeDeviceRunFrm); LoadProcess(false); Openexe(); } private void Openexe() { string strPathExe = Environment.CurrentDirectory + "\\BDebug2022110201_5" + "\\NJJ-ZK.exe"; process.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\BDebug2022110201_5"; process.StartInfo.FileName = strPathExe; process.StartInfo.Arguments = null;//-s -t 可以用来关机或重启 process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardInput = false;//true process.StartInfo.RedirectStandardOutput = false; process.StartInfo.RedirectStandardError = false; process.StartInfo.CreateNoWindow = false; process.Start();//启动 string strPathExe2 = Environment.CurrentDirectory + "\\CDebug2022110201_4" + "\\NJJ-ZK.exe"; processB.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\CDebug2022110201_4"; processB.StartInfo.FileName = strPathExe2; processB.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启 processB.StartInfo.UseShellExecute = false; processB.StartInfo.RedirectStandardInput = false; //true processB.StartInfo.RedirectStandardOutput = false; //true processB.StartInfo.RedirectStandardError = false; processB.StartInfo.CreateNoWindow = false; processB.Start();//启动 string strPathExe3 = Environment.CurrentDirectory + "\\ADebug2022110201_2" + "\\NJJ-ZK.exe"; processC.StartInfo.WorkingDirectory = Environment.CurrentDirectory + "\\ADebug2022110201_2"; processC.StartInfo.FileName = strPathExe3; processC.StartInfo.Arguments = null;//-s -t 可以用来关机、开机或重启 processC.StartInfo.UseShellExecute = false; processC.StartInfo.RedirectStandardInput = false; //true processC.StartInfo.RedirectStandardOutput = false; //true processC.StartInfo.RedirectStandardError = false; processC.StartInfo.CreateNoWindow = false; processC.Start();//启动 } private void Killexe() { try { process.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程 process.Close();//释放与此组件关联的所有资源 processB.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程 processB.Close();//释放与此组件关联的所有资源 processC.CloseMainWindow();//通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程 processC.Close();//释放与此组件关联的所有资源 } catch { } } private List LoadProcessCode() { var systemProcessCodes = ProcessFactory.GetProcessCodes(); var avaiableProcessCodes = SettingHelper.GetProcessCodes(); List pCodes = new List(); if (avaiableProcessCodes.Count > 0) { pCodes = avaiableProcessCodes.Intersect(systemProcessCodes).ToList(); } else { pCodes = systemProcessCodes; } if (pCodes.Count > 1) { pCodes.RemoveAll(u => u == ""); } return pCodes; } private List LoadProductionCode() { return SettingHelper.GetProductionCodes(); } /// /// 载入流程 /// /// 是否为初始化流程 private void LoadProcess(bool isInitialProcess = true) { if (isInitialProcess)//初次创建流程 { var processCodes = LoadProcessCode(); var productionCodes = LoadProductionCode(); _process = ProcessFactory.CreateStationProcess(processCodes[0], productionCodes[0], out string msg); if (!string.IsNullOrWhiteSpace(msg)) { _process = null; throw new ProcessException($"创建失败,{msg}", null, ExceptionLevel.Fatal); } _process.InitialProcess(""); } } #region Login bool isLogin = false; bool IsLogin { get => isLogin; set { isLogin = value; tsslLoginStatus.Text = isLogin ? "已登录" : "未登录"; foreach (var dock in dockPanelMain.Contents) { var menuFrm = dock as MenuFormBase; if (menuFrm != null) { menuFrm.SetLoginStatus(isLogin); } } } } private void OnLoginOK(bool isLogin) { IsLogin = isLogin; } #endregion #region CloseForm private void DeviceDisplayFrm_FormClosed(object sender, FormClosedEventArgs e) { string id = (sender as DeviceRunFrmBase).Device.Id; if (showedDeviceUIDict.ContainsKey(id)) { showedDeviceUIDict.Remove(id); } } private void CloseAllDeviceFrm() { this.Invoke(new Action(() => { this.SuspendLayout(); dockPanelMain.Contents.Select(u => { if (u is DeviceRunFrmBase runFrmBase) { return runFrmBase; } else { return null; } }).ToList().ForEach(u => { if (u == null) return; if (_process.DeviceCollection.Any(d => d.Id == u.Device.Id)) return; u.DockPanel = null; u.Close(); }); this.ResumeLayout(); })); } #endregion #region Layout布局 string _layoutFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{SettingHelper.GetSelectLayout()}.layout");//路径 private DeserializeDockContent m_deserializeMenuFrm; private DeserializeDockContent m_deserializeDeviceRunFrm; private IDockContent GetMenuFromPersistString(string persistString) { return null; } private IDockContent GetAllFormPersistString(string persistString) { if (persistString.StartsWith("MenuFrm")) { var desc = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); string menuCode = desc[1]; foreach(var dock in dockPanelMain.Contents) { MenuFormBase menu = dock as MenuFormBase; if (menu != null && menu.Tag.ToString() == menuCode) { return dock; } } MenuFormBase dockFrm = MenuFormFactory.GetMenuFrm(menuCode); if (dockFrm == null) { return null; } dockFrm.Text = desc[2]; dockFrm.DockStateChanged += DockStateChanged; dockFrm.SetLoginStatus(IsLogin); RegisterEvent(dockFrm); return dockFrm; } if (persistString.StartsWith("DeviceRunFrm")) { string deviceId = persistString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)[1]; var device = _process.DeviceCollection.FirstOrDefault(u => u.Id == deviceId); if (null == device || null == deviceId) { return null; } if (!showedDeviceUIDict.ContainsKey(deviceId)) { var runCtrl = UIFactory.GetRunCtrl(device); DeviceRunFrmBase runFrm = new DeviceRunFrmBase(device, runCtrl); runFrm.Text = device.Name; runFrm.MdiParent = this; runFrm.DockPanel = dockPanelMain; runFrm.DockState = DockState.Document; runFrm.FormClosed += DeviceDisplayFrm_FormClosed; runFrm.DockStateChanged += DockStateChanged; showedDeviceUIDict[deviceId] = runFrm; } return showedDeviceUIDict[deviceId]; } return null; } private void DockStateChanged(object sender, EventArgs e) { if (sender is DockContent dc) { if (dc.DockState == DockState.Float) { dc.Parent.FindForm().FormBorderStyle = FormBorderStyle.Sizable; } } } private void LoadLayoutFromXML(DeserializeDockContent dContent) { if (!File.Exists(_layoutFile)) return; dockPanelMain.SuspendLayout(true);//悬挂式布局 CloseAllDeviceFrm(); while (dockPanelMain.Contents.Count > 0) { dockPanelMain.Contents[0].DockHandler.DockPanel = null; } using (FileStream stream = new FileStream(_layoutFile, FileMode.Open)) { dockPanelMain.LoadFromXml(stream, dContent); stream.Close(); } dockPanelMain.ResumeLayout(true, true); } #endregion #region Device Display 设备展示到底部状态栏 readonly Dictionary showedDeviceUIDict = new Dictionary(); #endregion } }