我一直在尝试将窗体边框(标题栏)鼠标抬起一段时间,但它似乎已损坏(我发现许多其他文章也有相同的说明)。
我已经测试过:
Const WM_LBUTTONUP = &H202
Const WM_MBUTTONUP = &H208
Const WM_RBUTTONUP = &H205
Const WM_NCXBUTTONUP = &HAC
Const WM_XBUTTONUP = &H20C
Const WM_MENURBUTTONUP = &H122
Const WM_NCLBUTTONUP = &HA2
Const WM_NCRBUTTONUP = &HA5
Const WM_NCLBUTTONDOWN = &HA1
Const WM_NCMOUSEMOVE = &HA0
非常彻底。我看到的是,虽然 WM_NCLBUTTONUP 不起作用,但 WM_NCLBUTTONDOWN 起作用,并且在发布后(我期望 WM_NCLBUTTONUP),我得到了 WM_NCMOUSEMOVE 。问题是,每当您将鼠标移到客户区域(也称为表单边框)之外时,您也会按预期获得 WM_NCMOUSEMOVE。
在第一次尝试克服这个问题时,我想出了:
Private MouseIsDown As Boolean = False
Protected Overrides Sub WndProc(ByRef m As Message)
Const WM_NCLBUTTONDOWN = &HA1
Const WM_NCMOUSEMOVE = &HA0
If (m.Msg = WM_NCLBUTTONDOWN) Then
MouseIsDown = True
Console.WriteLine("NCLButtonDown")
ElseIf (m.Msg = WM_NCMOUSEMOVE) Then
If MouseIsDown Then
Console.WriteLine("NCMouseMove" + Environment.NewLine + "LParam: " + m.LParam.ToString() + Environment.NewLine + "WParam: " + m.WParam.ToString() + Environment.NewLine + "Res: " + m.Result.ToString())
MouseIsDown = False
Else
Console.WriteLine("Not mouseup")
End If
Else
End If
MyBase.WndProc(m)
End Sub
这似乎正在通过初始测试,但我很好奇这是否合适,或者是否有一条消息我只是错过了(我已经浏览过:http://www.pinvoke.net/default.aspx/Constants.WM相当但仔细观察,没有看到任何其他看起来正确的东西。
最佳答案
您可以使用 NativeWindow 或在 Form 实例上调用 WndProc Code Translator | VB WindowsMessages
试试这个:
private NativeWnd _nativeWnd;
private void Form1_Load(object sender, EventArgs e)
{
_nativeWnd = new NativeWnd(this);
}
class NativeWnd : NativeWindow, IDisposable
{
public NativeWnd(Form owner)
{
base.AssignHandle(owner.Handle);
}
private enum WindowMessages
{
// non client mouse
WM_NCMOUSEMOVE = 0x00A0,
WM_NCLBUTTONDOWN = 0x00A1,
WM_NCLBUTTONUP = 0x00A2,
WM_NCLBUTTONDBLCLK = 0x00A3,
WM_NCRBUTTONDOWN = 0x00A4,
WM_NCRBUTTONUP = 0x00A5,
WM_NCRBUTTONDBLCLK = 0x00A6,
WM_NCMBUTTONDOWN = 0x00A7,
WM_NCMBUTTONUP = 0x00A8,
WM_NCMBUTTONDBLCLK = 0x00A9,
}
private bool MouseIsDown;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
//Mouse Down
case (int)WindowMessages.WM_NCLBUTTONDOWN:
case (int)WindowMessages.WM_NCRBUTTONDOWN:
case (int)WindowMessages.WM_NCMBUTTONDOWN:
MouseIsDown = true;
Debug.Write("NCMouseDown");
break;
//MouseMove
case (int)WindowMessages.WM_NCMOUSEMOVE:
if (MouseIsDown)
{
Debug.Write("NCMouseMove");
MouseIsDown = false;
}
break;
//Mouse Up
case (int)WindowMessages.WM_NCRBUTTONUP:
case (int)WindowMessages.WM_NCLBUTTONUP:
case (int)WindowMessages.WM_NCMBUTTONUP:
Debug.Write("NCMouseUp");
break;
default:
base.WndProc(ref m);
break;
}
}
#region IDisposable
public void Dispose()
{
base.ReleaseHandle();
}
#endregion
}
关于vb.net - WndProc WM_NCMOUSEUP 不火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44335658/