Pregunta

¿Hay alguna forma de capturar MouseDown incluso desde el control TextBox .NET 2.0?Sé que la clase Control heredada tiene el evento, pero no está expuesto en TextBox.¿Hay alguna manera de anular el controlador de eventos?

También probé el control OpenNETCF TextBox2 que tiene expuesto el evento MouseDown, pero no importa lo que haga, no activa el controlador.

¿Alguna sugerencia?


¿Qué tipo de dispositivo móvil loco tienes que tiene un mouse?:)

Sí, Windows Mobile no tiene un mouse real, pero está equivocado al decir que Windows Mobile .NET no admite los eventos del mouse.Un clic o un movimiento en la pantalla todavía se considera un evento de "ratón".Se hizo de esta manera para que el código pudiera transferirse fácilmente desde Windows completo.Y este no es un problema específico de Windows Mobile.El control TextBox en Windows tampoco tiene eventos de mouse nativos.En este caso estaba usando Windows Mobile.

Editar:Y en una nota al margen... como Windows Mobile está construido con el núcleo de WindowsCE, que a menudo se usa para sistemas de escritorio integrados y clientes de Slim Terminal Services o "WinTerms", tiene soporte para un mouse de hardware y lo ha tenido durante mucho tiempo.La mayoría de los dispositivos simplemente no tienen puertos para enchufar uno.


Según el marco .NET, es compatible con el controlador de eventos Mousedown en un cuadro de texto.¿Qué sucede cuando intentas ejecutar el código?

En realidad, eso sólo está ahí porque lo hereda de "Control", al igual que cada otro control de formulario.Sin embargo, se anula (y creo que se cambia a privado) en la clase TextBox.Por lo tanto, no aparecerá en IntelliSense en Visual Studio.

Sin embargo, en realidad puedes escribir el código:

textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);

y se compilará y ejecutará bien, el único problema es que textBox1_MouseDown() no se activará cuando toque el control TextBox.Supongo que esto se debe a que el evento se anuló internamente.Ni siquiera quiero cambiar lo que está sucediendo en el evento internamente, solo quiero agregar mi propio controlador de eventos a ese evento para poder activar un código personalizado como lo haría con cualquier otro evento.

¿Fue útil?

Solución

Parece que tienes razón.Gorrón.Ningún evento MouseOver.

Sin embargo, una de las alternativas que siempre funciona con .NET es P/Invoke.Alguien ya se tomó el tiempo de hacer esto para .NET CF TextBox.Encontré esto en CodeProject:

http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx

Espero que esto ayude

Otros consejos

Sé que esta respuesta llega muy tarde, pero espero que termine siendo útil para alguien que encuentre esto.Además, no se me ocurrió a mí mismo.Creo que originalmente encontré la mayor parte de la información en los tableros OpenNETCF, pero lo que se escribe a continuación se extrajo de una de mis aplicaciones.

Puede obtener un evento de mousedown implementando la interfaz OpenNETCF.Windows.Forms.IMessageFilter y adjuntándola al filtro de mensajes de su aplicación.

static class Program {
    public static MouseUpDownFilter mudFilter = new MouseUpDownfilter();
    public static void Main() {
        Application2.AddMessageFilter(mudFilter);
        Application2.Run(new MainForm());
    }
}

Así es como podrías implementar MouseUpDownFilter:

public class MouseUpDownFilter : IMessageFilter {
    List ControlList = new List();

    public void WatchControl(Control buttonToWatch) {
        ControlList.Add(buttonToWatch);
    }

    public event MouseEventHandler MouseUp;
    public event MouseEventHandler MouseDown;

    public bool PreFilterMessage(ref Microsoft.WindowsCE.Forms.Message m) {
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;

        // If the message code isn't one of the ones we're interested in
        // then we can stop here
        if (m.Msg != WM_LBUTTONDOWN && m.Msg != WM_LBUTTONDOWN) {
            return false;
        }

        //  see if the control is a watched button
        foreach (Control c in ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int)m.LParam;
                int x = i & 0xFFFF;
                int y = (i >> 16) & 0xFFFF;
                MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 1, x, y, 0);

                if (m.Msg == WM_LBUTTONDOWN)
                    MouseDown(c, args);
                else
                    MouseUp(c, args);

                // returning true means we've processed this message
                return true;
            }
        }
        return false;
    }
}

Ahora este MouseUpDownFilter activará un evento MouseUp/MouseDown cuando ocurran en un control supervisado, por ejemplo su cuadro de texto.Para usar este filtro, agrega algunos controles observados y los asigna a los eventos que podría activar en el evento de carga de su formulario:

private void MainForm_Load(object sender, EventArgs e) {
    Program.mudFilter.WatchControl(this.textBox1);
    Program.mudFilter.MouseDown += new MouseEventHandler(mudFilter_MouseDown);
    Program.mudFilter.MouseUp += new MouseEventHandler(mudFilter_MouseUp);
}

void mudFilter_MouseDown(object sender, MouseEventArgs e) {
    if (sender == textBox1) {
        // do what you want to do in the textBox1 mouse down event :)
    }

}

Me parece bien.Probablemente sepas más que yo sobre Windows Mobile.:) Acabo de empezar a programar para ello.Pero en WinForms normales, puedes anular los métodos del controlador de eventos OnXxx todo lo que quieras.Una mirada rápida en Reflector con el CF muestra que Control, TextBoxBase y TextBox no le impiden anular el controlador de eventos OnMouseDown.

¿Has probado esto?:

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        //do something specific here
        base.OnMouseDown(e);
    }
}

¿Existe algún evento 'OnEnter' que puedas capturar en su lugar?

Es de suponer que también capturará cuando accedas al cuadro de texto y también ingresará al cuadro de texto tocando/haciendo clic en él, pero si eso no es un problema, entonces esta puede ser una solución alternativa más sencilla.

Según .Net Framework, el Controlador de eventos MouseDown en un cuadro de texto esta apoyado.¿Qué sucede cuando intentas ejecutar el código?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top