2011-01-22 15 views
6

Ho un Windows Form (che funziona in C#. NET).Windows Form: cattura MouseWheel

Il modulo ha un paio di pannelli in alto e alcuni ComboBox e DataGridView sul lato inferiore.

Desidero utilizzare gli eventi di scorrimento sui pannelli superiori, ma se si seleziona a es. ComboBox l'attenzione è persa. I pannelli contengono vari altri controlli.

Come è possibile ricevere sempre gli eventi della rotellina del mouse quando il mouse si trova su uno dei pannelli? Finora ho provato a utilizzare gli eventi MouseEnter/MouseEnter ma senza fortuna.

risposta

13

Ciò che si descrive come i suoni che si desidera replicare la funzionalità di, ad esempio Microsoft Outlook, dove non c'è bisogno di cliccare in realtà per mettere a fuoco il controllo per utilizzare il mouse ruota su di esso.

Questo è un problema relativamente avanzato da risolvere: consiste nell'implementare l'interfaccia IMessageFilter del modulo di contenimento, cercando gli eventi WM_MOUSEWHEEL e indirizzandoli al controllo su cui si trova il passaggio del mouse.

Ecco un esempio (da 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); 
    } 
} 

Si noti che questo codice è attivo per tutte le forme nell'applicazione, non solo la forma principale.

+0

Grazie, visto lì ma non sono sicuro del motivo per cui la gestione di WM_MOUSEWHEEL non è molto auspicabile. – n0ter

+0

Ehi, questo è il mio codice! Non è così sicuro che l'attribuzione richiesta sia appropriata qui, dovrebbe essere. –

+0

Il commento reso dal poster è "La gestione di Windows degli eventi MouseWheel non è molto auspicabile", il che significa che l'implementazione predefinita di Windows della rotellina del mouse significa che invia gli eventi al controllo con focus, non il controllo che il mouse sta passando finita, come la maggior parte delle persone si aspetterebbe o desidererebbe. –

0

Ogni controllo ha un evento rotellina della ruota che si verifica quando la rotellina del mouse si muove mentre il controllo è attivo.

Check this out per ulteriori informazioni: Control.MouseWheel Event

Problemi correlati