2

我在 Winforms C# 项目中有一个 ComboBox。当用户右键单击组合框以调出上下文菜单,然后从默认的 ContextMenuStrip 中选择一个项目(左键单击)时,我希望能够捕获该事件。我应该处理哪个事件?

是否可以在不制作我自己的自定义 ContextMenuStrip 的情况下做到这一点?如果我必须自己制作,有没有一种使用 Windows 默认 ContextMenuStrip 作为起点的好方法?

编辑:这个问题类似: 将项目添加到默认的文本框上下文菜单

但它正在谈论将项目添加到默认菜单。我在询问从默认上下文菜单中选择项目的捕获事件。如果我需要制作一个自定义的 ContextMenuStrip 来执行此操作,那很好,请这样回答。

4

2 回答 2

0

抱歉,我最初误解了这个问题,但现在修改了我的答案,向您展示如何从上下文菜单中检测点击

在寻找解决方案时,我遇到了许多指向 WinProc 的文章。沿着那条大道走下去,我遇到了以下情况

由于您对单击命令感兴趣,因此我进入了菜单通知,然后查看了WM_MENUCOMMAND消息。

然后,您必须创建一个用户控件并将其更改为从文本框继承并添加以下覆盖

public partial class TextBoxUsingDefaultContextMenu : TextBox
{
    public TextBoxUsingDefaultContextMenu()
    {
        InitializeComponent();
    }

    protected override void WndProc(ref Message m)
    {
        const int WM_CONTEXTMENU = 0x007B;
        const int WM_MENUCOMMAND = 0x0126;
        const int WM_COMMAND = 0x0111;

        switch (m.Msg)
        {
            case WM_CONTEXTMENU:
                MessageBox.Show("Opening Context Menu");
                break;

            case WM_MENUCOMMAND:
                MessageBox.Show("WM Menu Command Event fired");
                break;

            case WM_COMMAND:
                MessageBox.Show("WM Command Event fired");
                break;

        }

        base.WndProc(ref m);
    }

    protected override void DefWndProc(ref Message m)
    {
        base.DefWndProc(ref m);
    }
}

写上面的代码,我可以检测到“上下文菜单打开”事件,但还没有检测到点击事件。其他人将不胜感激这里的任何帮助,甚至这个主题对我来说也是新的。

于 2013-04-18T18:20:32.493 回答
0

有几个ContextMenuStrip事件可能会对您有所帮助。该MouseClick事件为您提供了一个MouseEventArgs参数,其中包括单击了哪个鼠标按钮。该ItemClicked事件为您提供了一个ToolStripItemClickedEventArgs参数,其中包括被单击的菜单项。 MouseClick之前触发ItemClicked,您需要使用在表单类级别定义的变量在两者之间进行通信。

于 2019-06-19T13:12:11.490 回答