Winforms WM_NCHITTEST、HTCAPTION和最大化窗口

Winforms WM_NCHITTEST、HTCAPTION和最大化窗口,winforms,winapi,Winforms,Winapi,我通过指定边框样式NONE和WM_NCHITTEST的自定义处理来创建自定义绘制窗口。我已经将某些区域定义为“我的窗口标题”,并在该区域中为WM_NCHITTEST返回HTCAPTION结果。当窗口处于正常状态时,我期望该行为。可以通过拖动“我的窗口标题”来移动窗口,也可以通过双击来最大化窗口 问题在于我的窗口在最大化状态下的行为。我仍然在“我的窗口标题”区域返回WM_NCHITTEST的HTCAPTION结果,再次双击窗口可以将其恢复到原始大小,但它仍然可以移动,这不是我想要的。我应该怎么做来

我通过指定边框样式NONE和WM_NCHITTEST的自定义处理来创建自定义绘制窗口。我已经将某些区域定义为“我的窗口标题”,并在该区域中为WM_NCHITTEST返回HTCAPTION结果。当窗口处于正常状态时,我期望该行为。可以通过拖动“我的窗口标题”来移动窗口,也可以通过双击来最大化窗口

问题在于我的窗口在最大化状态下的行为。我仍然在“我的窗口标题”区域返回WM_NCHITTEST的HTCAPTION结果,再次双击窗口可以将其恢复到原始大小,但它仍然可以移动,这不是我想要的。我应该怎么做来纠正这种行为


修正:


HitTestForNC方法负责评估我定制表单上的命中测试结果。实现可能看起来很难看,但它非常简单。

这是我用来防止窗口在最大化时被拖动的代码

// Indicates the form caption
Const HT_CAPTION As Integer = &H2
// Windows Message Non Client Button Down
Const WM_NCLBUTTONDOWN As Integer = &HA1

//Routine to implement the 'Drag Window' functionality.
Private Sub frm_Drag(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
  Handles Me.MouseDown

  //Do not move the form if it is maximized.
  If Not Me.WindowState = FormWindowState.Maximized Then
     If e.Button = Windows.Forms.MouseButtons.Left Then
        sender.Capture = False
        Me.WndProc(Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
        CType(HT_CAPTION, IntPtr), IntPtr.Zero))
     End If
  End If
End Sub

你所描述的有点奇怪-最大化的窗口通常不能移动。特别是,它占据了整个桌面区域,而且在拖动其标题(即,命中测试为
HT_caption
的区域)时,系统不会“拖动”它

请指定更多信息:

  • 您有多少台台式机(是多显示器系统)
  • 您是否在
    WM_GETMINMAXINFO
    上响应以防止您的窗口占用整个桌面区域
  • 顺便说一句,我可以想象一个解决办法:当你的窗口最大化时,不要在点击测试时返回
    HT\u字幕。相反,您可以返回
    HT\u CLIENT
    ,这将防止窗口拖动


    但是,当双击时,您必须手动实现窗口的“恢复”。然后,您应该在
    WM_lbuttondblck
    上做出响应,并手动恢复您的位置。

    从Windows 7中,预期和正确的行为是,最大化拖动的窗口应该是可拖动的。使用记事本或任何其他windows应用程序尝试:-停靠或最大化的窗口将自动恢复为“还原”大小并可拖动

    // Indicates the form caption
    Const HT_CAPTION As Integer = &H2
    // Windows Message Non Client Button Down
    Const WM_NCLBUTTONDOWN As Integer = &HA1
    
    //Routine to implement the 'Drag Window' functionality.
    Private Sub frm_Drag(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) _
      Handles Me.MouseDown
    
      //Do not move the form if it is maximized.
      If Not Me.WindowState = FormWindowState.Maximized Then
         If e.Button = Windows.Forms.MouseButtons.Left Then
            sender.Capture = False
            Me.WndProc(Message.Create(Me.Handle, WM_NCLBUTTONDOWN, _
            CType(HT_CAPTION, IntPtr), IntPtr.Zero))
         End If
      End If
    End Sub