我想要右键单击标题栏上的上下文菜单
c#中的任何提示/样本?
更新 - 由于各种原因,右键单击表单将无法正常工作,因为表单不为空并且表单是动态合成的....
答案 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消息。你可能也不希望这样。