无法在ComboBox中检测到鼠标右键

我有一个简单的下拉式ComboBox。 当用户右键单击列表中的某个项目时,我想打开一个新窗口,但是在检测到右键单击时遇到问题。

我的代码:

private void cmbCardList_MouseClick(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right && cmbCardList.SelectedIndex != -1) { frmViewCard vc = new frmViewCard(); vc.updateCardDisplay(cmbCardList.SelectedItem); vc.Show(); } } 

如果我改变e.Button == MouseButtons.Left整个事情就好了。 我有什么方法可以让我按照我的意愿工作?

我担心,除非你做一些严肃的黑客攻击,否则它将无法实现。 本文将解释。

引用给你:

个人控制

以下控件不符合标准鼠标单击事件行为:

Button,CheckBox, ComboBox和RadioButton控件

  • 左键单击:单击,鼠标单击

  • 右键单击:未单击事件

  • 左键双击:单击,鼠标单击; 单击,鼠标单击

  • 右键双击:没有单击事件

作为这个问题的一个墓志铭,您可以使用普通的.NETfunction来完成这项工作; 你只需要深入了解事件调用堆栈。 而不是处理MouseClick事件,处理MouseDown事件。 我最近不得不做类似的事情,我只是覆盖了OnMouseDown方法,而不是附加一个处理程序。 但是,处理程序也应该工作。 这是代码:

  protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Right && !HandlingRightClick) { HandlingRightClick = true; if (!cmsRightClickMenu.Visible) cmsRightClickMenu.Show(this, e.Location); else cmsRightClickMenu.Hide(); } base.OnMouseDown(e); } protected override void OnMouseUp(MouseEventArgs e) { HandlingRightClick = false; base.OnMouseUp(e); } private bool HandlingRightClick { get; set; } 

HandlingRightClick属性用于防止OnMouseDown逻辑的多个触发器; UI将发送多个MouseDown消息,这可能会干扰隐藏右键单击菜单。 为了防止这种情况,我只在第一个MouseDown触发器上执行一次逻辑(逻辑很简单,我不在乎两个调用是否发生竞争,但你可能),然后忽略任何其他MouseDown触发器,直到发生MouseUp。 这不是完美的,但这将做你需要的。

您可以使用ContextMenuStripOpening事件来处理右键单击事件。

 var chk = new CheckBox(); chk.ContextMenuStrip = cmsNone; 

 private void cmsNone_Opening(object sender, CancelEventArgs e) { e.Cancel = true; var cms = (ContextMenuStrip)sender; var chk = cms.SourceControl; //do your stuff }