Pergunta

Existe alguma maneira de capturar o MouseDown mesmo no controle TextBox do .NET 2.0?Eu sei que a classe Control herdada possui o evento, mas ele não está exposto no TextBox.Existe uma maneira de substituir o manipulador de eventos?

Também tentei o controle OpenNETCF TextBox2 que tem o evento MouseDown exposto, mas não importa o que eu faça, ele não aciona o manipulador.

Alguma sugestão?


Que tipo de dispositivo móvel louco você tem que tem um mouse?:)

Sim, o Windows Mobile não possui um mouse real, mas você está enganado, pois o Windows Mobile .NET não oferece suporte a eventos de mouse.Um clique ou movimento na tela ainda é considerado um evento do “Mouse”.Isso foi feito dessa maneira para que o código pudesse ser transferido facilmente do Windows completo.E este não é um problema específico do Windows Mobile.O controle TextBox no Windows também não possui eventos de mouse nativos.Acontece que eu estava usando o Windows Mobile neste caso.

Editar:E por outro lado ... como o Windows Mobile é construído a partir do núcleo WindowsCE, que é frequentemente usado para sistemas de desktop incorporados e clientes Slim Terminal Services ou "WinTerms", ele tem suporte para um mouse de hardware e já existe há muito tempo.A maioria dos dispositivos simplesmente não possui portas para conectar um.


De acordo com a estrutura .NET, o manipulador de eventos Mousedown em uma caixa de texto é suportado.O que acontece quando você tenta executar o código?

Na verdade, isso só existe porque herda de "Control", assim como todo outro controle de formulário.No entanto, é substituído (e alterado para privado, acredito) na classe TextBox.Portanto, não aparecerá no IntelliSense no Visual Studio.

No entanto, você realmente pode escrever o código:

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

e ele será compilado e executado perfeitamente, o único problema é que textBox1_MouseDown() não será acionado quando você tocar no controle TextBox.Presumo que isso ocorra porque o Evento foi substituído internamente.Eu nem quero mudar o que está acontecendo no evento internamente, só quero adicionar meu próprio manipulador de eventos a esse evento para que eu possa disparar algum código personalizado como você faria com qualquer outro evento.

Foi útil?

Solução

Parece que você está certo.Desapontamento.Nenhum evento MouseOver.

Porém, um dos substitutos que sempre funciona com o .NET é o P/Invoke.Alguém já reservou um tempo para fazer isso no .NET CF TextBox.Encontrei isso no CodeProject:

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

Espero que isto ajude

Outras dicas

Eu sei que esta resposta está muito atrasada, mas espero que acabe sendo útil para alguém que a encontre.Além disso, não fui eu quem inventou isso inteiramente.Acredito que originalmente encontrei a maior parte das informações nas placas OpenNETCF, mas o que está digitado abaixo foi extraído de um dos meus aplicativos.

Você pode obter um evento mousedown implementando a interface OpenNETCF.Windows.Forms.IMessageFilter e anexando-a ao filtro de mensagens do seu aplicativo.

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

É assim que você poderia implementar o 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;
    }
}

Agora, este MouseUpDownFilter irá disparar um evento MouseUp/MouseDown quando eles ocorrerem em um controle monitorado, por exemplo, sua caixa de texto.Para usar esse filtro, você adiciona alguns controles monitorados e atribui aos eventos que ele pode disparar no evento de carregamento do seu formulário:

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

}

Justo.Você provavelmente sabe mais do que eu sobre o Windows Mobile.:) Acabei de começar a programar para isso.Mas em WinForms regulares, você pode substituir os métodos do manipulador de eventos OnXxx o quanto quiser.Uma rápida olhada no Reflector com o CF mostra que Control, TextBoxBase e TextBox não impedem que você substitua o manipulador de eventos OnMouseDown.

Você já tentou isso?:

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

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

existe um evento 'OnEnter' que você poderia capturar?

presumivelmente, ele também será capturado quando você tabular na caixa de texto e também entrar na caixa de texto tocando/clicando nela, mas se isso não for um problema, então esta pode ser uma solução alternativa mais direta

De acordo com o .Net Framework, o Manipulador de eventos MouseDown em um TextBox é suportado.O que acontece quando você tenta executar o código?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top