2011-01-22 6 views
6

У меня есть Windows Form (работает на C# .NET).Windows Forms: capture MouseWheel

Форма имеет пару панелей сверху и некоторые ComboBoxes и DataGridViews снизу.

Я хочу использовать события прокрутки на верхних панелях, но при выборе, например, ComboBox теряется. Панели содержат различные другие элементы управления.

Как я могу всегда получать события колеса мыши, когда мышь находится над любой из панелей? До сих пор я пытался использовать события MouseEnter/MouseEnter, но не повезло.

ответ

13

Что вы описали звуки, как вы хотите, чтобы повторить функциональность, например, Microsoft Outlook, где вам не нужно на самом деле нажмите, чтобы сосредоточить управление с помощью мыши колесо на нем.

Это относительно сложная задача для решения: она включает в себя реализацию интерфейса IMessageFilter содержащейся формы, поиск событий WM_MOUSEWHEEL и направление их в элемент управления, над которым курсирует мышь.

Вот пример (из here):

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x20a) { 
     // WM_MOUSEWHEEL, find the control at screen position m.LParam 
     Point pos = new Point(m.LParam.ToInt32()); 
     IntPtr hWnd = WindowFromPoint(pos); 
     if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { 
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
      return true; 
     } 
     } 
     return false; 
    } 

    // P/Invoke declarations 
    [DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(Point pt); 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    } 
} 

Обратите внимание, что этот код действует для всех форм в приложении, а не только основной формы.

+0

Спасибо, видел его там, но я не уверен, почему обработка WM_MOUSEWHEEL не очень желательна. – n0ter

+0

Эй, это мой код! Не так уж точно, если требуемая атрибуция здесь уместна, это должно быть. –

+0

Комментарий, который делает плакат: «Обработка Windows» событий MouseWheel не очень желательна », то есть стандартная реализация Windows для колеса мыши означает, что она отправляет события в элемент управления с фокусом, а не с контролем, который мышь висит поскольку большинство людей ожидало бы или желало бы. –

0

Каждый элемент управления имеет событие «колесико», которое происходит, когда колесико мыши перемещается, когда элемент управления имеет фокус.

Проверить это для получения дополнительной информации: Control.MouseWheel Event