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





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