Question

Je crée une application WinForms avec un ListView défini avec des détails permettant l'affichage de plusieurs colonnes.

J'aimerais que cette liste défile lorsque la souris est sur le contrôle et que l'utilisateur utilise la molette de la souris. Pour le moment, le défilement ne se produit que lorsque le ListView a le focus.

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

Était-ce utile?

La solution

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

Voici un exemple de crochet de souris de bas niveau

Autres conseils

" Simple " et 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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top