#c# #.net #winforms #listview #events
#c# #.net #winforms #listview #Мероприятия
Вопрос:
В принципе, если у вас есть стандартный Listview, в котором включен множественный выбор, события мыши вверх и вниз работают нормально.
Но если вы отключите множественный выбор и нажмете и удерживайте кнопку мыши в Listview, он немедленно запускает событие down, а затем up, пока кнопка мыши все еще нажата.
Есть ли способ предотвратить это? Я хочу, чтобы событие mouse up запускалось только тогда, когда я отпускаю кнопку мыши.
Ответ №1:
Обработка событий мыши ListView в WndProc немного сложна. Это то, что я мог бы сделать, переопределив 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() amp; 0xffff);
var y = (m.LParam.ToInt32() >> 16) amp; 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);
}
}
Комментарии:
1. Спасибо, кажется, работает лучше, но есть какое-то странное поведение, когда я использую мышь вниз / переместить для перемещения формы, она прыгает / скользит. Не уверен, что происходит.
2. Я сомневаюсь, что это может быть связано с пользовательской реализацией. Это не имеет никакого отношения к перемещению формы (сообщения мыши, не относящиеся к клиентской области). Я не видел такого поведения в примере на моей стороне.
3. @JoanVenge Протестирован с формой по умолчанию и пользовательской формой, которая перехватывает соответствующие
WM
-ы для перемещения и изменения размера. Работает с обоими без каких-либо проблем.4. Спасибо, ребята, я попробую еще раз.
5. @JoanVenge Вам удалось сделать вывод по этому поводу?