打开表单的上下文菜单

时间:2018-06-22 09:29:09

标签: vb.net winforms

我想在我的表单上的“最小化”按钮旁边添加一个带有一些选项(快捷方式)的下拉菜单。为此,我在代码项目https://www.codeproject.com/Articles/55180/Extending-the-Non-Client-Area-in-Aero上遵循了以下示例。 这完全可以满足我的需求(我考虑过隐藏边框样式,但后来我无法将窗体停靠在屏幕边缘),但由于某种原因,无法调用标题栏上的上下文菜单。

在示例中,我注意到WM_NCHITTEST事件的替代未使用HTSYSMENU结果,而仅在标题栏的整个区域返回了HTCAPTION。然后,如果鼠标位于标题栏的左侧,我便更改了代码以返回正确的值,并且通过单击该角,我设法调用了上下文菜单。

Dim p As New Point(LoWord(CInt(lparam)), HiWord(CInt(lparam)))
Dim cap As Rectangle = RectangleToScreen(New Rectangle(0, dwmMargins.cxLeftWidth, Width, dwmMargins.cyTopHeight - dwmMargins.cxLeftWidth))
    If cap.Contains(p) Then
        Dim mp As Point = MousePosition
        mp = PointToClient(mp)
        If mp.X < 30 Then
            Return New IntPtr(HTSYSMENU)
        Else
            Return New IntPtr(HTCAPTION)
        End If
    End If

但是,右键单击标题栏上的任意位置时,我找不到如何激活对上下文菜单的调用。 我尝试覆盖WndProc上的消息WM_NCRBUTTONUP并发送一条消息以显示“上下文菜单”,但似乎什么也没发生。

 Dim WM_CONTEXTMENU As Integer = &H7B
 If m.Msg = WM_NCRBUTTONUP Then
        Dim mp As Point = MousePosition
        mp = PointToClient(mp)
        Dwm.SendMessage(Me.Handle, WM_CONTEXTMENU, Me.Handle, Dwm.MAKEWPARAM(mp.Y, mp.X))


<DllImport("user32.dll")>
Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As Integer
End Function

我相信我正在尝试重新发明轮子,并且我不需要处理WM_NCRBUTTONUP消息来调用上下文菜单,因为它应该自动处理,但是我没有在线找到任何有关它的信息。

1 个答案:

答案 0 :(得分:0)

作为一种选择,您可以处理WM_NCRBUTTONUP并发送WM_POPUPSYSTEMMENU

case WM_NCRBUTTONUP:
{
    SendMessage(this.Handle, 0x313/*WM_POPUPSYSTEMMENU*/, (IntPtr)0, m.LParam);
    break;
}

还有我使用的SendMessage的签名:

[DllImport("user32.dll")]
static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);