C# WPF - 通过创建Mutex互斥对象实现窗体的单例模式

重写Startup方法

        /// <summary>
        /// 重写Startup方法
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            // 创建一个互斥对象
            Mutex mutex = new Mutex(true, "单实例程序Mutex", out bool IsNewInstans);
            // 判断是否存在
            if (!IsNewInstans)
            {
                // 查找窗体、显示到前台
                IntPtr intPtr = FindWindowW(null, "MainWindow");
                if (intPtr != IntPtr.Zero)
                {
                    SetForegroundWindow(intPtr);
                }// 退出
                Shutdown();
            }
        }  

导入两个WinAPI函数

        // 找到窗体
        //  FindWindowW F1 在MSDN Doc中查找
        //  HWND FindWindowW(
        //  LPCWSTR lpClassName,
        //  LPCWSTR lpWindowName
        //);
        [DllImport("User32", CharSet = CharSet.Unicode)]
        static extern IntPtr FindWindowW(string lpClassName, string lpWindowName);

        // 显示到前台
        // SetForegroundWindow F1 在MSDN Doc中查找
        // BOOL SetForegroundWindow(
        // HWND hWnd
        // );
        [DllImport("User32", CharSet = CharSet.Unicode)]
        static extern Boolean SetForegroundWindow(IntPtr hWnd);

通过FindWindowW函数可以查找到函数是否存在,然后再通过SetForegroundWindow函数将窗体显示到前台来。 

  作者:Jeremy.Wu
  出处:https://www.cnblogs.com/jeremywucnblog/
  本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2020-04-09 14:07  Jeremy.Wu  阅读(837)  评论(0编辑  收藏  举报