2013-06-02 2 views
0

У меня есть собственный элемент управления WinForms (полученный от Control), в котором я переопределяю события OnMouseXXX и OnKeyXXX.Обработка колесика мыши и событий клавиатуры при нажатии кнопки мыши

Я хочу обрабатывать события с колесами и/или клавиатурой , в то время как нажата кнопка мыши (то есть OnMouseDown был уволен, но OnMouseUp еще не был запущен). По какой-то причине я не могу получить ни одного из них, пока не отпущу кнопку мыши.

Просьба сообщить об этом. Использование interop/unsafe code (если необходимо) будет ОК, использование таймера для чтения состояния клавиатуры не будет.

+1

Невозможно идентифицировать событие, чтобы обрабатывать событие мыши, перетаскивая/нажимая кнопку мыши. проверить это: http://stackoverflow.com/questions/4820095/can-the-mouse-wheel-be-used-while-dragging-dropping – sjkm

+0

Похоже, что мне нужно, я попробую, спасибо вы! –

ответ

1

Вместо глобального крюка вы можете перейти на один уровень вверх и использовать IMessageFilter(). Это будет работать, когда ваше приложение сосредоточено только. Не знаете, на каком уровне вам нужно работать ...

public partial class MyUserControl : UserControl 
{ 

    private MyFilter filter; 

    public MyUserControl() 
    { 
     InitializeComponent(); 
     filter = new MyFilter(); 
     filter.LButtonScroll += new MyFilter.LBUTTONSCROLLDELEGATE(filter_LButtonScroll); 
     Application.AddMessageFilter(filter); 
    } 

    private void filter_LButtonScroll() 
    { 
     Console.WriteLine("WM_MOUSEWHEEL while LBUTTONDOWN"); 
    } 

    private class MyFilter : IMessageFilter 
    { 
     private bool LBUTTONDOWN = false; 
     private const int WM_LBUTTONDOWN = 0x201; 
     private const int WM_LBUTTONUP = 0x202; 
     private const int WM_MOUSEWHEEL = 0x20a; 

     public delegate void LBUTTONSCROLLDELEGATE(); 
     public event LBUTTONSCROLLDELEGATE LButtonScroll; 

     public bool PreFilterMessage(ref Message m) 
     { 
      switch (m.Msg) 
      { 
       case WM_LBUTTONDOWN: 
        LBUTTONDOWN = true; 
        break; 

       case WM_MOUSEWHEEL: 
        if (LBUTTONDOWN) 
        { 
         if (LButtonScroll != null) 
         { 
          LButtonScroll(); 
         } 
        } 
        break; 

       case WM_LBUTTONUP: 
        LBUTTONDOWN = false; 
        break; 
      } 
      return false; 
     } 

    } 
} 
+0

Удивительный, работает как шарм! Хотя крючки тоже в порядке, и оба метода применимы к моей ситуации, я должен признать, что это проще. Спасибо! –

+0

Оба подхода - это решения кувалды ... Я не думаю, что есть более чистый путь. –

+0

Согласен, но по моему опыту многие более или менее нестандартные функции требуют такого кода. Это приемлемо, но прискорбно. Кроме того, выяснилось, что этот подход не работает с drag-n-drop, поэтому я также могу проверить крючки, чтобы увидеть, будут ли они работать с ним. Но это выходит за рамки первоначального вопроса, поэтому этот ответ стоит выбранным :) –

Смежные вопросы