如何处理表单标题右键单击

时间:2009-12-22 17:42:17

标签: c# windows winforms winapi

我想要右键单击标题栏上的上下文菜单

c#中的任何提示/样本?

更新 - 由于各种原因,右键单击表单将无法正常工作,因为表单不为空并且表单是动态合成的....

6 个答案:

答案 0 :(得分:9)

您可以通过捕获Windows在用户右键单击标题栏时发送的WM_NCRBUTTONDOWN通知来执行此操作。控件类没有事件,你需要覆盖WndProc()。这是一个示例表单,您需要添加ContextMenuStrip:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }

    protected void OnTitlebarClick(Point pos) {
        contextMenuStrip1.Show(pos);
    }

    protected override void WndProc(ref Message m) {
        const int WM_NCRBUTTONDOWN = 0xa4;
        if (m.Msg == WM_NCRBUTTONDOWN) { 
            var pos = new Point(m.LParam.ToInt32());
            OnTitlebarClick(pos);
            return;
        }                                           
        base.WndProc(ref m);
    }
}

答案 1 :(得分:0)

MSDN explains如何处理Windows窗体控件上的右键单击。控件(包括Forms)继承MouseClick事件。

MouseEventArgs会告诉您通过Button属性点击了哪个按钮。查看MouseButtons枚举。

答案 2 :(得分:0)

如果您单击鼠标处理表单,则可以使用以下代码:

  private void Dialog_MouseClick(object sender, MouseEventArgs e)
  {
      if (e.Button == MouseButtons.Right)
      {                                
          this.Text = "new caption text";
      }
  }  

但是您必须确保为表单上的顶级控件生成此事件。例如,如果表单上有一个组框,它将接收鼠标单击事件而不是表单本身,用于组框下面的表单区域。

答案 3 :(得分:0)

当您右键单击标题栏时,已经有一个由Windows管理的菜单。

你想完全替换它吗?

如果你想添加它,你将不得不使用Win32 API和互操作,你必须子类化表单。

参见AppendMenu()函数。

答案 4 :(得分:0)

基本上你需要使用p-invoke来做到这一点。 Here有一个很好的例子 您可以从示例中看到,您需要手动模仿事件处理程序,但这非常简单。

答案 5 :(得分:0)

您可以覆盖表单的WndProc并捕获WM_NCRBUTTONDOWN消息:

   protected override void WndProc(ref Message m)
   {
       const int WM_NCRBUTTONDOWN = 0xA4;

       if (m.Msg == WM_NCRBUTTONDOWN)
       {
           MessageBox.Show("Caption right clicked!");
       }
       else
       {
           base.WndProc(ref m);
       }
   }

但是,此代码将禁止窗口的上下文菜单。你可能不希望这样。如果右键单击窗口边框,也会发送WM_NCRBUTTONDOWN消息。你可能也不希望这样。