先声明对象以及相应常数:
//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); }
至此就可以了~
本文仅为记录,为以后使用方便,无别意~
本文参考了以下文章: