基本上,如果您有一个打开了多重选择的标准列表视图,则鼠标向上和向下事件可以正常工作。
但是,如果您关闭多选并在列表视图上单击并按住鼠标按钮,则当鼠标按钮仍处于按下状态时,它会立即触发向下然后向上事件。
有办法防止这种情况吗?我只希望在释放鼠标按钮时触发鼠标向上事件。
ListView中的鼠标事件处理WndProc https://referencesource.microsoft.com/?WT.mc_id=DT-MVP-5003235#System.Windows.Forms/winforms/Managed/System/WinForms/ListView.cs,6248有点复杂。这就是我可以通过覆盖来做的事情OnMouseUp
and 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)