Захват события MouseDown для .NET TextBox

Есть ли способ захватить MouseDown даже из элемента управления .NET 2.0 TextBox? Я знаю, что у унаследованного класса Control есть событие, но оно не отображается в TextBox. Есть ли способ переопределить обработчик событий?

Я также попробовал элемент управления OpenNETCF TextBox2, у которого есть событие MouseDown, но что бы я ни делал, он не запускает обработчик.

Какие-либо предложения?


Что за сумасшедшее мобильное устройство с мышью? :)

Да, в Windows Mobile нет мыши, но вы ошибаетесь, что Windows Mobile .NET не поддерживает события мыши. Щелчок или перемещение по экрану по-прежнему считается событием «Мышь». Это было сделано для того, чтобы код можно было легко перенести с полной Windows. И это не проблема Windows Mobile. Элемент управления TextBox в Windows также не имеет собственных событий мыши. Просто в этом случае я использовал Windows Mobile.

Изменить: И на стороне примечания ... поскольку Windows Mobile построена на ядре WindowsCE, которое часто используется для встраиваемых настольных систем и клиентов Slim Terminal Services или "WinTerms", он поддерживает аппаратную мышь и имеет долгое время. У большинства устройств просто нет портов для их подключения.


Согласно .NET Framework, обработчик событий MouseDown в TextBox поддерживается. Что происходит, когда вы пытаетесь запустить код?

Фактически, это только потому, что он наследует его от «Control», как и любой другой элемент управления Form. Однако он переопределен (и, как мне кажется, изменен на частный) в классе TextBox. Поэтому он не будет отображаться в IntelliSense в Visual Studio.

Однако вы действительно можете написать код:

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

и он будет компилироваться и работать нормально, единственная проблема заключается в том, что textBox1_MouseDown () не будет запущен, когда вы коснетесь элемента управления TextBox. Я предполагаю, что это связано с внутренним переопределением события. Я даже не хочу менять то, что происходит внутри события, я просто хочу добавить свой собственный обработчик события к этому событию, чтобы я мог запустить некоторый собственный код, как вы могли бы с любым другим событием.

Ответов (5)

Решение

Похоже, ты прав. Облом. Нет события MouseOver.

Однако один из резервных вариантов, который всегда работает с .NET, - это P / Invoke. Кто-то уже нашел время, чтобы сделать это для .NET CF TextBox. Я нашел это в CodeProject:

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

Надеюсь это поможет

есть ли событие OnEnter, которое вы могли бы записать вместо этого?

предположительно, он также захватил бы, когда вы вкладываете в текстовое поле, а также вводите текстовое поле, нажав / щелкнув по нему, но если это не проблема, то это может быть более простой обходной путь

Согласно .NET Framework, обработчик событий MouseDown в TextBox поддерживается. Что происходит, когда вы пытаетесь запустить код?

Справедливо. Вы, наверное, знаете о Windows Mobile больше, чем я. :) Я только начал программировать под него. Но в обычных WinForms вы можете как угодно переопределить методы обработчика событий OnXxx. Беглый взгляд на Reflector с CF показывает, что Control, TextBoxBase и TextBox не мешают вам переопределить обработчик событий OnMouseDown.

Вы пробовали это ?:

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

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

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

Вы можете получить событие mousedown, реализовав интерфейс OpenNETCF.Windows.Forms.IMessageFilter и прикрепив его к фильтру сообщений вашего приложения.

static class Program {
    общедоступный статический MouseUpDownFilter mudFilter = new MouseUpDownfilter ();
    public static void Main () {
        Application2.AddMessageFilter (mudFilter);
        Application2.Run (новый MainForm ());
    }
}

Вот как можно реализовать MouseUpDownFilter:

открытый класс MouseUpDownFilter: IMessageFilter {
    Список ControlList = новый список ();

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

    публичное событие MouseEventHandler MouseUp;
    публичное событие MouseEventHandler MouseDown;

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

        // Если код сообщения не тот, который нас интересует
        // тогда мы можем остановиться на этом
        if (m.Msg! = WM_LBUTTONDOWN && m.Msg! = WM_LBUTTONDOWN) {
            вернуть ложь;
        }

        // посмотрим, является ли элемент управления отслеживаемой кнопкой
        foreach (Control c в ControlList) {
            if (m.HWnd == c.Handle) {
                int i = (int) m.LParam;
                int x = я & 0xFFFF;
                int y = (я >> 16) & 0xFFFF;
                MouseEventArgs args = новый MouseEventArgs (MouseButtons.Left, 1, x, y, 0);

                если (m.Msg == WM_LBUTTONDOWN)
                    MouseDown (c, аргументы);
                еще
                    MouseUp (c, аргументы);

                // возвращение истины означает, что мы обработали это сообщение
                вернуть истину;
            }
        }
        вернуть ложь;
    }
}

Теперь этот MouseUpDownFilter будет запускать событие MouseUp / MouseDown, когда они происходят в наблюдаемом элементе управления, например в текстовом поле. Чтобы использовать этот фильтр, вы добавляете некоторые наблюдаемые элементы управления и назначаете событиям, которые он может запускать в событии загрузки вашей формы:

private void MainForm_Load (отправитель объекта, EventArgs e) {
    Program.mudFilter.WatchControl (this.textBox1);
    Program.mudFilter.MouseDown + = новый обработчик событий MouseEventHandler (mudFilter_MouseDown);
    Program.mudFilter.MouseUp + = новый обработчик событий MouseEventHandler (mudFilter_MouseUp);
}

void mudFilter_MouseDown (отправитель объекта, MouseEventArgs e) {
    if (sender == textBox1) {
        // делаем то, что вы хотите сделать в событии нажатия мыши textBox1 :)
    }

}