陷阱 WM_NCHITTEST 消息但继续检查 MouseEnter/-Leave
Trap WM_NCHITTEST message but keep checking for MouseEnter/-Leave
我有一个表格,我删除了标题栏但保留了边框(参见 )。
在上面的回答中声明需要将 FormBorderStyle
设置为 Sizable
或 SizableToolWindow
,为了阻止表单变大,您会陷入困境WM_NCHITTEST 事件。唯一的问题是这样做会 而不是 引发正常的 Form_MouseEnter
或 Form_MouseLeave
事件。
有什么解决方法吗?
我的代码:
Protected Overrides Sub WndProc(ByRef message As Message)
If message.Msg = &H84 Then 'WM_NCHITTEST
Me.Focus() 'Focus the form when it receives a click.
Return
End If
MyBase.WndProc(message)
End Sub
Private Sub PanelForm_MouseLeave(sender As Object, e As System.EventArgs) Handles PanelForm.MouseLeave
PlaceOnScreen(False) 'Placed a breakpoint here, it won't execute.
End Sub
这只是一个错误,WM_NCHITTEST 的 return 值现在为 0。这意味着 "the mouse is nowhere"。所以很多东西都停止工作,比如激活和聚焦 window 和 MouseEnter 事件。你必须 return 1(又名 HTCLIENT),意思是 "it is on the client area":
Protected Overrides Sub WndProc(ByRef message As Message)
If message.Msg = &H84 Then 'WM_NCHITTEST
message.Result = CType(1, IntPtr)
Return
End If
MyBase.WndProc(message)
End Sub
我有一个表格,我删除了标题栏但保留了边框(参见
在上面的回答中声明需要将 FormBorderStyle
设置为 Sizable
或 SizableToolWindow
,为了阻止表单变大,您会陷入困境WM_NCHITTEST 事件。唯一的问题是这样做会 而不是 引发正常的 Form_MouseEnter
或 Form_MouseLeave
事件。
有什么解决方法吗?
我的代码:
Protected Overrides Sub WndProc(ByRef message As Message)
If message.Msg = &H84 Then 'WM_NCHITTEST
Me.Focus() 'Focus the form when it receives a click.
Return
End If
MyBase.WndProc(message)
End Sub
Private Sub PanelForm_MouseLeave(sender As Object, e As System.EventArgs) Handles PanelForm.MouseLeave
PlaceOnScreen(False) 'Placed a breakpoint here, it won't execute.
End Sub
这只是一个错误,WM_NCHITTEST 的 return 值现在为 0。这意味着 "the mouse is nowhere"。所以很多东西都停止工作,比如激活和聚焦 window 和 MouseEnter 事件。你必须 return 1(又名 HTCLIENT),意思是 "it is on the client area":
Protected Overrides Sub WndProc(ByRef message As Message)
If message.Msg = &H84 Then 'WM_NCHITTEST
message.Result = CType(1, IntPtr)
Return
End If
MyBase.WndProc(message)
End Sub