2008-09-17 23 views
11

Estoy haciendo una aplicación WinForms con un ListView configurado al detalle para que se puedan mostrar varias columnas.Desplazamiento de la rueda del mouse de C# ListView sin foco

Me gustaría que esta lista se desplace cuando el mouse esté sobre el control y el usuario use la rueda de desplazamiento del mouse. En este momento, el desplazamiento solo ocurre cuando el ListView tiene foco.

¿Cómo puedo hacer que el desplazamiento de ListView, incluso cuando no tiene foco?

Respuesta

3

Normalmente solo obtendrá eventos de mouse/teclado en una ventana o control cuando tiene foco. Si quieres verlos sin foco, entonces tendrás que poner en marcha un gancho de nivel inferior.

Here is an example low level mouse hook

5

y solución de trabajo "simple":

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 
} 
Cuestiones relacionadas