2008-09-17 10 views
11

Ich mache eine WinForms-App mit einem ListView-Set auf Details, so dass mehrere Spalten angezeigt werden können.C# ListView Mausrad scrollen ohne Fokus

Ich möchte für diese Liste einen Bildlauf durchführen, wenn sich die Maus über dem Steuerelement befindet und der Benutzer das Mausrad verwendet. Im Moment passiert das Scrollen nur, wenn der ListView den Fokus hat.

Wie kann ich den ListView scrollen, auch wenn er nicht fokussiert ist?

Antwort

3

Normalerweise erhalten Sie Maus-/Tastaturereignisse nur dann in ein Fenster oder Steuerelement, wenn sie den Fokus haben. Wenn Sie sie ohne Fokus sehen wollen, müssen Sie einen niedrigeren Haken anbringen.

Here is an example low level mouse hook

5

"Simple" und Arbeitslösung:

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 
}