2013-04-18 3 views
1

У меня есть ComboBox в проекте Winforms C#. Когда пользователь щелкнет правой кнопкой мыши на ComboBox, чтобы вызвать контекстное меню, затем выбирает элемент (левый клик) из стандартного ContextMenuStrip, я хочу, чтобы иметь возможность захватить это событие. С какими событиями я должен справиться?Как обнаружить контекстное меню по умолчанию (ComboBox)

Возможно ли это сделать, не создавая собственный пользовательский ContextMenuStrip? Если мне нужно сделать свой собственный, есть ли хороший способ использовать ContextMenuStrip по умолчанию в качестве отправной точки?

Edit: Этот вопрос похож: Add item to the default TextBox context menu

Но это говорит о добавлении элементов в меню по умолчанию. Я задаю вопрос об отображении событий, выбирающих элемент из контекстного меню по умолчанию. Если мне нужно создать пользовательский ContextMenuStrip, чтобы это сделать, это нормально, ответьте так.

+1

просто зарегистрируйте событие click в контекстном меню –

+0

и как вы это сделаете для стандартного ContextMenuStrip? – ford

+0

contextmenustrip, похоже, имеет событие onclick - http://msdn.microsoft.com/en-gb/library/system.windows.forms.contextmenustrip.aspx - вы могли бы это переопределить? – Sayse

ответ

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

WRT код выше, я могу обнаружить «Контекстное меню Открытия» событие, но еще не щелкнув событие. Любая помощь здесь будет оценена другими, и даже эта тема для меня нова.

+0

Я согласен , Я бы воспользовался этим методом для разработки пользовательского ContextMenuStrip. Однако я ничего не вижу об обнаружении событий из стандартного Windows ContextMenuStrip – ford

+0

Благодарим вас за то, что вы обновили свой ответ. Я проверю это решение. – ford

+0

Здравствуйте, @ford, пока я мог обнаружить событие WM_CONTEXTMENU. Я не смог обнаружить WM_COMMAND или WM_MENUCOMMAND. Если бы вы могли заставить его работать, не могли бы вы сообщить мне. По достоинству оцените! –