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

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

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

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


What kind of crazy mobile device do you have that has a mouse? :)

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

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


According to the .Net Framework, the MouseDown Event Handler on a TextBox is supported. What happens when you try to run the code?

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

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

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

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

Какое у вас сумасшедшее мобильное устройство с мышью? :) Серьезно, причина отсутствия события MouseDown в том, что в Windows Mobile нет мыши. Что вы пытаетесь сделать в обработчике событий MouseDown? Может есть другой способ.

ageektrapped 11.08.2008 16:46
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
11 954
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

Справедливо. Вы, наверное, знаете о 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);
    }
}
Ответ принят как подходящий

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

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

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

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

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

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

Я знаю, что этот ответ слишком поздно, но, надеюсь, он окажется полезным для того, кто его найдет. Кроме того, я не совсем это придумал. Я полагаю, что изначально я нашел большую часть информации на досках 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 :)
    }

}

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