Вопрос

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

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

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


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

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

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


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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

Вот как вы можете реализовать 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;
    }
}

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

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

}

Справедливо.Вы, вероятно, знаете больше, чем я, о 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);
    }
}

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top