Pregunta

Estoy creando una aplicación WinForms con un ListView configurado en detalle para que se puedan mostrar varias columnas.

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 ListView tiene el foco.

¿Cómo puedo hacer que ListView se desplace incluso cuando no tiene foco?

¿Fue útil?

Solución

Normalmente, solo obtendrá eventos de mouse/teclado en una ventana o control cuando esté enfocado.Si quieres verlos sin foco, tendrás que colocar un gancho de nivel inferior.

Aquí hay un ejemplo de gancho de mouse de bajo nivel.

Otros consejos

Solución "simple" y funcional:

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
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top