Как предотвратить немедленное запуск события MouseUp в Winforms Listview, когда мышь все еще не нажата?

#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 Вам удалось сделать вывод по этому поводу?