`
thinkgem
  • 浏览: 581487 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C# Windows 桌面应用只运行一个实例 2

    博客分类:
  • C#
阅读更多
  /// <summary>
  /// 构造函数
  /// </summary>
  public FrmMain()
  {
            if (this.TryCheckSingleton()){
                Environment.Exit(0);
            } 
  }
 
  //单一线程同步事件
  private EventWaitHandle ewhSingleton;
  //保存CMIS Windows 消息编号
  private int WM_CMISSTARTED;
 
        #region 单一客户端实例
        /// <summary>
        /// 验证单一线程
        /// </summary>
        /// <returns></returns>
        private bool TryCheckSingleton(){
            try{
                this.WM_CMISSTARTED = (int)RegisterWindowMessage("CmisStarted");
                bool flag;
                this.ewhSingleton = new EventWaitHandle(false, EventResetMode.AutoReset, "CmisInstance", out flag);
                if (!flag){
                    PostMessage((IntPtr)0xffff, this.WM_CMISSTARTED, 0, 0);
                }
                return !flag;
            }catch (Exception){
                return false;
            }
        }
        /// <summary>
        /// 激活主窗口
        /// </summary>
        private void ActiveMainWindow()
        {
            base.Activate();
            BringWindowToTop(base.Handle);
        }
        /// <summary>
        /// 获得 Windows 消息
        /// </summary>
        /// <param name="m"></param>
        protected override void WndProc(ref Message m)
        {
            if (m.Msg == this.WM_CMISSTARTED){
                this.ActiveMainWindow();
                return;
            }
            base.WndProc(ref m);
        }
        #region Windows API 声明
        /// <summary>
        /// 注册Windows消息
        /// </summary>
        /// <param name="lpString">注册消息的名字</param>
        /// <returns>消息编号</returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern uint RegisterWindowMessage(string lpString);
        /// <summary>
        /// 该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里
        /// </summary>
        /// <param name="hWnd">接收消息的窗口句柄</param>
        /// <param name="Msg">被寄送的消息</param>
        /// <param name="wParam">附加的消息特定的信息</param>
        /// <param name="lParam">附加的消息特定的信息</param>
        /// <returns>函数调用成功,返回非零值;如果函数调用失败,返回值是零</returns>
        [DllImport("user32.dll")]
        public static extern int PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
        /// <summary>
        /// 该函数将指定的窗口设置到Z序的顶部
        /// </summary>
        /// <param name="hWnd">窗口句柄</param>
        /// <returns>如果函数成功,返回值为非零;如果函数失败,返回值为零</returns>
        [DllImport("user32.dll")]
        public static extern bool BringWindowToTop(IntPtr hWnd);
        #endregion
        #endregion
 
分享到:
评论

相关推荐

    C#.net_经典编程例子400个

    48 实例048 向提示框中添加图标 49 第2章 控件应用 51 2.1 TextBox控件应用 52 实例049 只允许输入数字的TextBox控件 52 实例050 限制用户名称长度及设置密码文本 54 实例051 自动删除...

    C#程序开发范例宝典(第2版).part08

    1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...

    C#程序开发范例宝典(第2版).part12

    1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...

    C#程序开发范例宝典(第2版).part02

    1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...

    明日科技C#开发入门及项目实战

    实例032 开发一个猜数字游戏 第4章 字符与字符串 实例033 字母与ascii码的转换 实例034 获取字符串中汉字的个数 实例035 从字符串中分离文件路径、文件名及扩展名 实例036 对字符串进行加密与解密 实例037 开发一个...

    《C#经典编程220例》.(明日科技).【带书签】-共3部分

    实例032 开发一个猜数字游戏 45 第4章 字符与字符串 47 实例033 字母与ascii码的转换 48 实例034 获取字符串中汉字的个数 50 实例035 从字符串中分离文件路径、文件名及扩展名 51 实例036 对字符串进行加密与解密 53...

    C#程序开发范例宝典(第2版).part13

    1.1 菜单应用实例 2 实例001 带历史信息的菜单 2 实例002 菜单动态合并 3 实例003 像开始菜单一样漂亮的菜单 4 实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6...

Global site tag (gtag.js) - Google Analytics