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, "\tAre you sure to reset the system menu?", "Question", MessageBoxButtons.YesNo) == DialogResult.Yes)
                            {
                                // 复位系统菜单 
                                SystemMenu.ResetSystemMenu(this);
                            }
                        } break;
                    case m_AboutID: // “关于”菜单项 
                        {
                            MessageBox.Show(this, "作者: Interkey \n\n " + "2013-12-08 15:51:56", "关于");
                        } break;
                    // 这里可以针对另外的菜单项设计处理过程 
                }
            }

            base.WndProc(ref m);
        }

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

本文参考了以下文章:

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

禁止ALT+F4

使用API禁用窗体关闭按钮 

 

转载于:https://www.cnblogs.com/Interkey/p/SystemMenuClass.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值