如何从默认上下文菜单(ComboBox)中检测点击

时间:2013-04-18 18:00:57

标签: c# .net winforms .net-3.5

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

是否可以在不创建自己的自定义ContextMenuStrip的情况下执行此操作?如果我必须自己创建,有没有一种方法可以使用Windows默认的ContextMenuStrip作为起点?

编辑: 这个问题类似: Add item to the default TextBox context menu

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

2 个答案:

答案 0 :(得分:0)

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

在搜索解决方案时,我遇到了许多指向WinProc的文章。走下那条大道,我遇到了以下

由于您对click命令感兴趣,我进入了菜单通知,然后查看了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);
    }
}

在上面的代码中,我可以检测到“上下文菜单打开”事件,但尚未检测到单击的事件。这里的任何帮助都会受到其他人的赞赏,甚至这个主题对我来说也是新的。

答案 1 :(得分:0)

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