Windows Forms: захват мышиных колес - PullRequest
6 голосов
/ 22 января 2011

У меня есть форма Windows (работает в C # .NET).

Форма имеет несколько панелей сверху и некоторые ComboBoxes и DataGridViews снизу.

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

Как я могу всегда получать события колесика мыши, когда мышь находится над какой-либо из панелей?До сих пор я пытался использовать события MouseEnter / MouseEnter, но безуспешно.

Ответы [ 2 ]

13 голосов
/ 22 января 2011

То, что вы описываете, звучит так, как будто вы хотите повторить функциональность, например, Microsoft Outlook, где вам не нужно нажимать, чтобы сфокусировать элемент управления, чтобы использовать на нем колесо мыши.

Это относительно сложная проблема, требующая решения: она включает в себя реализацию интерфейса IMessageFilter вмещающей формы, поиск WM_MOUSEWHEEL событий и направление их в элемент управления, над которым наведена мышь.

Вот пример (из здесь ):

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsApplication1 {
  public partial class Form1 : Form, IMessageFilter {
    public Form1() {
      InitializeComponent();
      Application.AddMessageFilter(this);
    }

    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());
        IntPtr hWnd = WindowFromPoint(pos);
        if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) {
          SendMessage(hWnd, m.Msg, m.WParam, m.LParam);
          return true;
        }
      }
      return false;
    }

    // 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);
  }
}

Обратите внимание, что этот код активен для всех форм в вашем приложении, а не только для основной формы.

0 голосов
/ 22 января 2011

У каждого элемента управления есть событие колесика мыши, которое происходит, когда колесо мыши перемещается, когда элемент управления имеет фокус.

Проверьте это для получения дополнительной информации: Событие Control.MouseWheel

...