vb.net - WndProc WM_NCMOUSEUP 不火

标签 vb.net winforms wndproc

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

我已经测试过:

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/

相关文章:

.net - 从 VB.NET 中的另一个类/线程访问 TextBox 控件时出现问题

c# - 使 ComboBox 只接受特定类型

c# - 为什么调用 ClearSelected 并附加数据源后 SelectedIndex 可能为 0?

c# - 在 C# Winforms 应用程序中提供 "Paste Link"功能

c++ - 通过 PostMessage 发送/接收字符串

c++ - 将 lparam 作为指向类的指针发送,并在 WndProc() 中使用它

c# - WM_SYSCOMMAND 与 wParam 0xF063?

regex - 使用正则表达式 VB NET 匹配和替换字符串中的第一个和最后一个字符和子字符串

.net - 在我的项目中使用 Office 2007 UI ribbon .dll 文件

c# - 识别网络路径存在的最快方法