Program.cs 6.7 KB
using log4net;
using log4net.Config;
using OnlineStore.Common;
using OnlineStore.DeviceLibrary;
using OnlineStore.DUOStore;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;

namespace OnlineStore.DUOStore
{
    static class Program
    {

        public static bool IsAdmin = false;
        #region 方法四:使用的Win32函数的声明

        /// <summary>
        /// 找到某个窗口与给出的类别名和窗口名相同窗口 
        /// </summary>
        /// <param name="lpClassName">类别名</param>
        /// <param name="lpWindowName">窗口名</param>
        /// <returns>成功找到返回窗口句柄,否则返回null</returns>
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        /// <summary>
        /// 切换到窗口并把窗口设入前台,类似 SetForegroundWindow方法的功能
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="fAltTab">True代表窗口正在通过Alt/Ctrl +Tab被切换</param>
        [DllImport("user32.dll ", SetLastError = true)]
        static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);

        /// <summary>
        ///  设置窗口的显示状态 
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <param name="cmdShow">指示窗口如何被显示</param>
        /// <returns>如果窗体之前是可见,返回值为非零;如果窗体之前被隐藏,返回值为零</returns>
        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        public const int SW_RESTORE = 9;
        public static IntPtr formhwnd;
    //    public static readonly ILog LOGGER = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        #endregion
        
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] Args)
        {
            //string path = @"http://localhost:4090/rest/api/v1/station/status";
            //HttpHelper.PostOperation(path, new Operation());

            //List<InOutParam> aa = new List<InOutParam>();
            //aa.Add(new InOutParam(MoveType.InStore, "123", "123", 7, 8, 1));
            //var aaa = from a in aa where a.TargetPosition == 1 select a;
            //var xccsaf = aaa.Count();
            //string a = "LZAUJN0208MAN;E20210105 0365;BQT001200261510792021010515000;R107920210118A1049";
            //a = a.Replace("\u001a", "");
            CheckConfigFile();


            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

            // 因为方法三只能是最小化的窗体显示出来,如果隐藏到托盘中则不能把运行的程序显示出来 
            Process currentproc = Process.GetCurrentProcess();
            Process[] processcollection = Process.GetProcessesByName(currentproc.ProcessName.Replace(".vshost", string.Empty));
            //  该程序已经运行,

            bool isShow = false;
            if (processcollection.Length >= 1)
            {
                foreach (Process process in processcollection)
                {
                    if (process.Id != currentproc.Id)
                    {
                        // 如果进程的句柄为0,即代表没有找到该窗体,即该窗体隐藏的情况时
                        if (process.MainWindowHandle.ToInt32().Equals(0))
                        {
                            string formTitle = ConfigAppSettings.GetValue(Setting_Init.App_Title);
                            // 获得窗体句柄
                            formhwnd = FindWindow(null, formTitle);
                            // 重新显示该窗体并切换到带入到前台
                            ShowWindow(formhwnd, SW_RESTORE);
                            SwitchToThisWindow(formhwnd, true);
                            isShow = true;
                            break;
                        }
                        else
                        {
                            // 如果窗体没有隐藏,就直接切换到该窗体并带入到前台
                            // 因为窗体除了隐藏到托盘,还可以最小化
                            SwitchToThisWindow(process.MainWindowHandle, true);
                            isShow = true;
                            break;
                        }
                    }
                }
            }
            System.Environment.CurrentDirectory = Application.StartupPath;
            if (!isShow)
            {
                XmlConfigurator.Configure(); 
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new FrmStore());
            }
        }

        private static void CheckConfigFile()
        {
            string configfile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            string backupfile = configfile + ".backup";
            try
            {
                var c =  new XmlDocument();
                c.Load(configfile);
                File.Copy(configfile, backupfile, true);
            }
            catch {
                if (File.Exists(backupfile)) {
                    File.Copy(backupfile, configfile, true);
                }
            }            
        }

        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            LogUnhandledException(e.ExceptionObject);
        }

        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            LogUnhandledException(e.Exception);
        }

        static void LogUnhandledException(object exceptionobj)
        {
            //这里可以进一步地写日志
           LogUtil.error("LogUnhandledException:"+exceptionobj.ToString());
        }

        public static bool TestAdmin()
        {

            FrmPwd fw = new FrmPwd(10);
            DialogResult result = fw.ShowDialog();
            if (!result.Equals(DialogResult.OK))
            {
                //LogUtil.info("切换界面显示时,没有正确输入密码");
                return false;
            }
            Program.IsAdmin = true;
            return true;
        }
    }
}