我想在我的表单上的“最小化”按钮旁边添加一个带有一些选项(快捷方式)的下拉菜单。为此,我在代码项目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消息来调用上下文菜单,因为它应该自动处理,但是我没有在线找到任何有关它的信息。
答案 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);