• SystemMenu类的用法


    先声明对象以及相应常数:

            //SystemMenu对象
            private SystemMenu m_systemMenu = null;
            // ID 常数定义 (可变,只要不与系统冲突即可)
            private const int m_AboutID = 0x100;
            private const int m_ResetID = 0x101; 

    然后在Form或Control继承类的初始化事件中添加相应代码,如在窗体的Load事件中:

            private void Form1_Load(object sender, EventArgs e)
            {
                try
                {
                    m_systemMenu = SystemMenu.FromForm(this);
                    // 添加一个separator ... 
                    m_systemMenu.AppendSeparator();
                    //m_systemMenu.RemoveMenuItem(0);//移除"还原"菜单项
                    //m_systemMenu.RemoveMenuItem(3);//移除"关闭"菜单项
                    //m_systemMenu.RemoveMenuItem(m_systemMenu.GetMenuItemCount(this) - 2);//移除"关闭"菜单项    
                    //本文地址:http://www.cnblogs.com/Interkey/p/SystemMenuClass.html
                    //禁用"关闭"菜单项以及按钮
                    m_systemMenu.DisableClose(this);
                    // 添加"关于" 菜单项 
                    m_systemMenu.AppendMenu(m_AboutID, "关于");
                    // 在菜单顶部加上"复位"菜单项
                    m_systemMenu.InsertSeparator(0);
                    m_systemMenu.InsertMenu(0, m_ResetID, "复位系统菜单");
                }
                catch (NoSystemMenuException err)
                {
                    MessageBox.Show(err.Message);
                }
            }


    本文地址:http://www.cnblogs.com/Interkey/p/SystemMenuClass.html

    最后处理自定义菜单项的事件,必须重载从Form或Control继承类的WndProc函数:

    首先截获WM_SYSCOMMAND消息。当用户点击系统菜单的某一项或者选择“最大化”按钮,“最小化”按钮或者“关闭”按钮时,我们要检索该消息。特别注意,消息对象的WParam参数正好包含了被点击菜单项的ID。于是可以实现如下重载:

            protected override void WndProc(ref Message m)
            {
                // 通过截取WM_SYSCOMMAND消息并进行处理 
                // 注意,消息WM_SYSCOMMAND被定义在WindowMessages枚举类中 
                // 消息的WParam参数包含点击的项的ID 
                // 该值与通过上面类的InsertMenu()或AppendMenu()成员函数传递的一样 
                if (m.Msg == (int)WindowMessages.wmSysCommand)
                {
                    switch (m.WParam.ToInt32())
                    {
                        case m_ResetID: // reset菜单项的ID 
                            {
                                if (MessageBox.Show(this, "	Are you sure to reset the system menu?", "Question", MessageBoxButtons.YesNo) == DialogResult.Yes)
                                {
                                    // 复位系统菜单 
                                    SystemMenu.ResetSystemMenu(this);
                                }
                            } break;
                        case m_AboutID: // “关于”菜单项 
                            {
                                MessageBox.Show(this, "作者: Interkey 
    
     " + "2013-12-08 15:51:56", "关于");
                            } break;
                        // 这里可以针对另外的菜单项设计处理过程 
                    }
                }
    
                base.WndProc(ref m);
            }

    至此就可以了~
    本文仅为记录,为以后使用方便,无别意~

    本文参考了以下文章:

    用C#和本地Windows API操纵系统菜单

    禁止ALT+F4

    使用API禁用窗体关闭按钮 

  • 相关阅读:
    Console
    在IOS10系统中无法定位问题
    c# js 时间
    ConcurrentDictionary,ConcurrentStack,ConcurrentQueue
    转 控件拖动 未验证
    消息处理模拟点击
    C ProcessAsUser
    SessionChange
    installer
    mysql主从同步配置
  • 原文地址:https://www.cnblogs.com/Interkey/p/SystemMenuClass.html
Copyright © 2020-2023  润新知