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

11.08.2008 12:36:20
Какое у вас сумасшедшее мобильное устройство с мышью? :) Серьезно, причина отсутствия события MouseDown в том, что в Windows Mobile нет мыши. Что вы пытаетесь сделать в обработчике события MouseDown? Может быть, есть другой способ.
ageektrapped 11.08.2008 12:46:25
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

0
11.08.2008 14:45:05

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

0
20.12.2011 16:18:14

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

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

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

0
19.09.2008 13:45:09

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

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

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

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

открытый класс MouseUpDownFilter: IMessageFilter {
    List ControlList = new List ();

    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 = 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);
                еще
                    MouseUp (c, args);

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

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

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

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

}

2
10.08.2009 14:38:56