当我在VB6中从上下文菜单中选择一个选项时,如何阻止显示额外的上下文菜单?

当我在VB6中从上下文菜单中选择一个选项时,如何阻止显示额外的上下文菜单?,vb6,contextmenu,subclassing,ime,componentone,Vb6,Contextmenu,Subclassing,Ime,Componentone,我正在使用VB6表单维护一个应用程序,该表单包含ComponentOne VSFlexGrid 7.0。我们有一个自定义上下文菜单,允许用户执行一些专门的复制和粘贴操作。最近,我们遇到了以下问题: 突出显示其中一个单元格中的某些文本。 在单元格中单击鼠标右键,文本仍高亮显示。 选择一个关联菜单选项。 发生请求的上下文菜单操作。 将显示另一个与所示内容类似的上下文菜单,其中包含从右到左的阅读顺序、打开IME和重新转换等选项。 我如何让第二个上下文菜单消失?我已经尝试过这种方法,但迄今为止运气不佳。

我正在使用VB6表单维护一个应用程序,该表单包含ComponentOne VSFlexGrid 7.0。我们有一个自定义上下文菜单,允许用户执行一些专门的复制和粘贴操作。最近,我们遇到了以下问题:

突出显示其中一个单元格中的某些文本。 在单元格中单击鼠标右键,文本仍高亮显示。 选择一个关联菜单选项。 发生请求的上下文菜单操作。 将显示另一个与所示内容类似的上下文菜单,其中包含从右到左的阅读顺序、打开IME和重新转换等选项。 我如何让第二个上下文菜单消失?我已经尝试过这种方法,但迄今为止运气不佳。我的WindowProc功能如下:

Function WindowProc(ByVal hw As Long, _
                    ByVal uMsg As Long, _
                    ByVal wParam As Long, _
                    ByVal lParam As Long) As Long

    Select Case uMsg
        Case WM_RBUTTONUP
            frmMain.PopupMenu frmMain.mnuPopUp
        Case Else
            WindowProc = CallWindowProc(lpPrevWndProc, hw, _
                                       uMsg, wParam, lParam)
    End Select
End Function
复制操作发生后,我看到的uMsg值是15 WM_PAINT和32 WM_SETCURSOR。我还注意到,当我没有高亮显示单元格中的文本时,表单级MouseUp事件会触发,但当我高亮显示单元格中的文本时,它不会触发


如果有人对VB6和/或ComponentOne有更深入的了解,请给我更多关于事件发生顺序的详细信息,如何避免显示这个额外的上下文菜单?

您应该处理WM_CONTEXTMENU来显示上下文菜单,而不是WM_RBUTTONUP,因为触发它的不仅仅是右键单击。

在BeforeMouseDown事件中,如果用户右键单击,请尝试设置Cancel=True。

您在网格上有BeforeMouseDown事件吗?如果右键单击,请尝试设置Cancel=True。@wqw:是,设置Cancel=True会隐藏额外的上下文菜单。不过,在老鼠下城之前,这么做似乎还为时过早。它是否仍然适用于稍后启动的事件,如MouseDown或MouseUp?我认为MouseDown/Up不会启动,但无法取消菜单已连接的WM_RBUTTONUP。WM_CONTEXTMENU是一种更文明的方式,但它是由DefWindowProc实现的,不需要自定义控件来调用它,因此您的网格可能不支持它-您必须测试它。@wqw:请回答您的评论。我想我会接受的。我仍然需要听取开发人员的反馈,他们正在处理这个bug。他在另一个办公室,我代表他问这个问题。我认为这确实为我们指明了正确的方向。你看到我在原始帖子中提到的额外上下文菜单了吗?没有,我没有使用你的代码,但该消息是触发真正上下文菜单的消息。如果覆盖该选项,则根本不应显示真实的选项。