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

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

任何提示/示例在C#前?

更新 – 由于各种原因,右键单击表单将无法正常工作,因为表单不是空的,表单是dynamic合成的,所以….

Solutions Collecting From Web of "如何处理表单标题右键单击"

您可以通过捕获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); } } 

MSDN解释了如何处理Windows窗体控件上的右键单击。 包括表单在内的控件继承了MouseClick事件。

MouseEventArgs会告诉你什么按钮被点击通过Button属性。 看看MouseButtons枚举。

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

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

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

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

你想完全取代它吗?

如果你想添加到它,你将不得不使用Win32 API和互操作,你将不得不继承该窗体。

请参阅AppendMenu()函数。

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

您可以重写窗体的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消息也将被发送,如果你右击窗口边界以及。 你也可能不想要这个。