C# 如何从默认上下文菜单(组合框)检测单击

C# 如何从默认上下文菜单(组合框)检测单击,c#,.net,winforms,.net-3.5,C#,.net,Winforms,.net 3.5,我在Winforms C#项目中有一个组合框。当用户右键单击组合框以打开上下文菜单,然后从默认上下文菜单中选择一个项目(左键单击)时,我希望能够捕获该事件。我应该处理哪些事件 是否可以在不创建自定义ContextMenuStrip的情况下执行此操作?如果我必须自己制作,有没有一个好方法可以使用Windows默认ContextMenuStrip作为起点 编辑: 这个问题类似: 但它是在讨论将项目添加到默认菜单。我问的是如何从默认上下文菜单中选择一项来捕获事件。如果我需要自定义ContextMen

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

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

编辑: 这个问题类似:


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

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

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

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

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

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);
    }
}

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

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

只需在ContextMenua上注册click事件,如何为默认ContextMenuStrip执行此操作?ContextMenuStrip似乎有一个
onclick
事件--您可以覆盖它这可能是吗?我很感谢你们的帮助,但你们似乎都没有完全解决我询问默认ContextMenuStriph的问题。很抱歉,我以为你们在询问自定义ContextMenuI。我同意,我将按照此方法开发自定义ContextMenuStrip。但是,我看不到有关从默认Windows上下文检测事件的任何信息。感谢您更新您的答案。我将检查此解决方案。Hello@ford,我可以检测WM_CONTEXTMENU事件。我无法检测WM_命令或WM_菜单命令。如果你能让它工作,你能告诉我吗。非常感谢!罗穆卢斯,谢谢你的帮助。看起来我现在的答案是“制作自己的自定义上下文菜单要容易得多”。