C # ListView прокрутка колесика мыши без фокуса - PullRequest
11 голосов
/ 18 сентября 2008

Я создаю приложение WinForms с ListView, настроенным на детализацию, чтобы можно было отображать несколько столбцов.

Я бы хотел, чтобы этот список прокручивался, когда мышь находится над элементом управления, а пользователь использует колесо прокрутки мыши. Прямо сейчас прокрутка происходит только тогда, когда у ListView есть фокус.

Как сделать прокрутку ListView, даже если она не имеет фокуса?

Ответы [ 2 ]

6 голосов
/ 13 сентября 2014

«Простой» и рабочий раствор:

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
}
3 голосов
/ 18 сентября 2008

Обычно вы получаете события мыши / клавиатуры в окне или элементе управления только тогда, когда он имеет фокус. Если вы хотите видеть их без фокуса, вам придется установить крючок более низкого уровня.

Вот пример низкоуровневого крючка мыши

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...