2008-09-17 7 views
11

Je crée une application WinForms avec un ensemble ListView à détailler pour que plusieurs colonnes puissent être affichées.C# Roulette de la souris de la souris ListView sans mise au point

Je voudrais que cette liste défile lorsque la souris survole le contrôle et que l'utilisateur utilise la molette de la souris. À l'heure actuelle, le défilement se produit uniquement lorsque le ListView a le focus.

Comment faire défiler ListView même s'il n'a pas le focus?

Répondre

3

Normalement, les événements de souris/clavier ne se produisent que sur une fenêtre ou un contrôle lorsqu'il a le focus. Si vous voulez les voir sans focus, vous devrez mettre en place un crochet de niveau inférieur.

Here is an example low level mouse hook

5

"simple" et la solution de travail:

public class FormContainingListView : Form, IMessageFilter 
{ 
    public FormContainingListView() 
    { 
     // ... 
     Application.AddMessageFilter(this); 
    } 

    #region mouse wheel without focus 

    // 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); 

    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() & 0xffff, m.LParam.ToInt32() >> 16); 
      IntPtr hWnd = WindowFromPoint(pos); 
      if (hWnd != IntPtr.Zero && hWnd != m.HWnd && System.Windows.Forms.Control.FromHandle(hWnd) != null) 
      { 
       SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
       return true; 
      } 
     } 
     return false; 
    } 

    #endregion 
} 
Questions connexes