gpt4 book ai didi

vb.net - WndProc WM_NCMOUSEUP 不火

转载 作者:行者123 更新时间:2023-12-02 07:09:03 24 4
gpt4 key购买 nike

我一直在尝试将窗体边框(标题栏)鼠标抬起一段时间,但它似乎已损坏(我发现许多其他文章也有相同的说明)。

我已经测试过:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com