相关疑难解决方法(0)

WM_NCLBUTTONUP消息在拖动表单结尾时没有发送,怎么办?

编辑: tl;博士去第一条评论.

这个问题源于另一个问题,当鼠标在表格边框上下降时,我的获取MouseDown事件?

在那个问题中,当用户在表单边框上按下鼠标左键(准备拖动)时,我需要有一个表单触发事件,这非常有效.问题是当用户完成此操作时,通过放开鼠标左键,我还想要触发一个事件.

为此,我将此代码生成为"基本形式"类,其他形式将从中派生.我已经删除了FireMouseButton...()简洁的方法; 他们解雇自定义事件.

const int WM_NCLBUTTONUP = 0xA2;
const int WM_NCLBUTTONDWN = 0xA1;
protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_NCLBUTTONUP)
        FireMouseButtonUp();
    if (m.Msg == WM_NCLBUTTONDWN)
        FireMouseButtonDown();
    base.WndProc(ref m);
}
Run Code Online (Sandbox Code Playgroud)

这个问题是WM_NCLBUTTONUP消息没有像我预期的那样发送.在查看了描述后,WM_NCLBUTTONUP我可以看到为什么,

当用户在窗口的非客户区域内释放鼠标左键时,会发布[WM_NCLBUTTONUP].此消息将发布到包含光标的窗口.如果窗口捕获了鼠标,则不会发布此消息.

因为表单在拖动时捕获了鼠标,所以它不会收到WM_NCLBUTTONUP消息.(如果形式最大化的话会这样).这个问题解释得更好一个窗口未最大化时丢失的WM_NCLBUTTONUP消息的奇怪问题.

这个问题的答案有点帮助,但对我来说却引起很多困惑.在下面的代码中我有一个小的SSCCE,它实现了从上面的答案的解决方案给出的一些代码,检查WMNCHITTEST消息以查看鼠标是否已被释放;

这个想法是WM_NCHITTEST当鼠标在表单中移动时应该发送.因此,一旦拖动停止,此消息应与DragStartPointWndProc消息参数中的鼠标位置一起发送; 其中DragStartPoint所述当记录WM_NCLBUTTONDOWN被接收的消息.

但问题是,在WM_NCHITTEST拖动开始后并不总是发送,只有在顶部边框的远端开始拖动时(见下图).在WM_NCLBUTTONDOWN顶部边框(从不为两侧或底部),单击后始终发送消息.所以这很好,但WM_NCHITTEST正如所指出的那样WM_NCLBUTTONUP,但有时只会发送.

在此输入图像描述

如何让WM_NCHITTEST"测试"在下面的代码中工作,以便在用户停止拖动表单后通知我?("测试"正在检查DragStartPointif语句中WM_NCHITTEST …

c# wndproc winforms

5
推荐指数
0
解决办法
1062
查看次数

Winform对话框:检测移动的开始和结束

我想检测一下winform何时开始被拖动以及何时停止.

原因很简单:我想提供一个Ctrl + Z功能,将窗口设置回原来的位置,当移动开始和结束时我都需要存储

有没有可能做到这一点?

更新1:我发现了如何检测停止拖动: C#表单移动停止事件

我想现在检测START拖动

move detect winforms

2
推荐指数
1
解决办法
1035
查看次数

标签 统计

winforms ×2

c# ×1

detect ×1

move ×1

wndproc ×1