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.
Gracias, lo he visto allí, pero no estoy seguro de por qué el manejo de WM_MOUSEWHEEL no es muy deseable. – n0ter
¡Hola, ese es mi código! No estoy tan seguro de si la atribución requerida es apropiada aquí, debería ser. –
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. –