2011-01-22 21 views
6

Tengo un Windows Form (que funciona en C# .NET).Windows Forms: capturar MouseWheel

El formulario tiene un par de paneles en la parte superior y algunos cuadros combinados y DataGridViews en la parte inferior.

Quiero utilizar los eventos de desplazamiento en los paneles laterales superiores, pero si se selecciona una, p. ComboBox el foco está perdido. Los paneles contienen varios otros controles.

¿Cómo podría siempre recibir los eventos de la rueda del mouse cuando el mouse está sobre alguno de los paneles? Hasta ahora intenté usar los eventos MouseEnter/MouseEnter pero sin suerte.

Respuesta

13

Lo que usted describe suena como desea replicar la funcionalidad de, por ejemplo, Microsoft Outlook, en el que no es necesario hacer clic en realidad para enfocar el control de usar el ratón rueda sobre ella.

Este es un problema relativamente avanzado de resolver: implica la implementación de la interfaz IMessageFilter del formulario que contiene, buscando los eventos WM_MOUSEWHEEL y dirigiéndolos al control sobre el que se mueve el mouse.

He aquí un ejemplo (de here):

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

Tenga en cuenta que este código está activa para todas las formas de su aplicación, no sólo la forma principal.

+0

Gracias, lo he visto allí, pero no estoy seguro de por qué el manejo de WM_MOUSEWHEEL no es muy deseable. – n0ter

+0

¡Hola, ese es mi código! No estoy tan seguro de si la atribución requerida es apropiada aquí, debería ser. –

+0

El comentario que hace el póster es que "Windows no maneja los eventos MouseWheel", lo que significa que la implementación predeterminada de Windows de la rueda del mouse significa que envía los eventos al control con foco, no el control que el mouse está moviendo terminado, como la mayoría de la gente esperaría o desearía. –

0

Cada control tiene un evento de rueda del mouse que se produce cuando la rueda del mouse se mueve mientras el control tiene foco.

mira esto para más información: Control.MouseWheel Event

Cuestiones relacionadas