C# 当鼠标仍处于按下状态时,如何防止Winforms Listview中立即触发MouseUp事件?

C# 当鼠标仍处于按下状态时,如何防止Winforms Listview中立即触发MouseUp事件?,c#,.net,winforms,listview,events,C#,.net,Winforms,Listview,Events,基本上,如果您有一个启用了多选的标准Listview,则鼠标上下事件可以正常工作 但是,如果关闭“多重选择”并在Listview上单击并按住鼠标按钮,则当鼠标按钮仍处于按下状态时,它会立即触发“向下”事件,然后触发“向上”事件 有没有办法防止这种情况?我只希望在释放鼠标按钮时触发鼠标上升事件。中的ListView鼠标事件处理有点复杂。这就是我可以通过覆盖OnMouseUp和WndProc来停止引发不必要的MouseUp: using System.Collections.Specialized;

基本上,如果您有一个启用了多选的标准Listview,则鼠标上下事件可以正常工作

但是,如果关闭“多重选择”并在Listview上单击并按住鼠标按钮,则当鼠标按钮仍处于按下状态时,它会立即触发“向下”事件,然后触发“向上”事件


有没有办法防止这种情况?我只希望在释放鼠标按钮时触发鼠标上升事件。

中的ListView鼠标事件处理有点复杂。这就是我可以通过覆盖
OnMouseUp
WndProc
来停止引发不必要的
MouseUp

using System.Collections.Specialized;
using System.Reflection;
using System.Windows.Forms;
public class MyListView : ListView
{
    const int WM_LBUTTONUP = 0x0202, WM_RBUTTONUP = 0x0205, WM_MBUTTONUP = 0x0208;
    const int LISTVIEWSTATE_mouseUpFired = 0x00080000;
    FieldInfo listViewStateField;
    public MyListView()
    {
        listViewStateField = (typeof(ListView)).GetField("listViewState",
               BindingFlags.NonPublic | BindingFlags.Instance);
    }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_LBUTTONUP || m.Msg == WM_MBUTTONUP || m.Msg == WM_RBUTTONUP) {
            var value = (BitVector32)listViewStateField.GetValue(this);
            value[LISTVIEWSTATE_mouseUpFired] = true;
            listViewStateField.SetValue(this, value);
            var x = (m.LParam.ToInt32() & 0xffff);
            var y = (m.LParam.ToInt32() >> 16) & 0xffff;
            var e = new MouseEventArgs(
                m.Msg == WM_LBUTTONUP ? MouseButtons.Left :
                m.Msg == WM_MBUTTONUP ? MouseButtons.Middle :
                MouseButtons.Right, 1, x, y, 0);
            OnMouseUp(e);
        }
        base.WndProc(ref m);
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (Control.MouseButtons == MouseButtons.None)
            base.OnMouseUp(e);
    }
}

谢谢,它似乎工作得更好,但当我使用鼠标按下/移动来移动窗体时,会出现一些奇怪的行为,它会跳跃/滑动。不确定发生了什么。我怀疑这可能与自定义实现有关。它与表单移动(非客户端区域鼠标消息)无关。在我这边的例子中,我没有看到这种行为。@JoanVenge使用一个默认表单和一个自定义表单进行测试,该表单截取相关的
WM
-s进行移动和调整大小。这两个都可以,没有任何问题。Thx很多人,我会再试一次。@JoanVenge你对此有结论吗?