.NET TextBox の MouseDown イベントをキャプチャする
-
08-06-2019 - |
質問
.NET 2.0 TextBox コントロールからでも MouseDown をキャプチャする方法はありますか?継承された Control クラスにイベントがあることはわかっていますが、TextBox では公開されていません。イベントハンドラーをオーバーライドする方法はありますか?
また、MouseDown イベントが公開されている OpenNETCF TextBox2 コントロールも試しましたが、何をしてもハンドラーが起動されません。
助言がありますか?
マウスを持っているどんなクレイジーなモバイルデバイスがありますか?:)
はい、Windows Mobile には実際のマウスがありませんが、Windows Mobile .NET が Mouse イベントをサポートしていないと誤解しています。画面上のクリックまたは移動は、引き続き「マウス」イベントとみなされます。このようにして、完全な Windows からコードを簡単に移植できるようになりました。これは Windows Mobile 固有の問題ではありません。Windows の TextBox コントロールにもネイティブ マウス イベントはありません。この場合、私はたまたま Windows Mobile を使用していました。
編集:余談ですが...Windows Mobile は、組み込みデスクトップ システムやスリム ターミナル サービス クライアント (「WinTerms」) によく使用される WindowsCE コアで構築されているため、ハードウェア マウスをサポートしており、長年にわたってサポートされています。ほとんどのデバイスには、接続するためのポートがありません。
.NETフレームワークによると、テキストボックスのMousedownイベントハンドラーがサポートされています。コードを実行しようとするとどうなりますか?
実際には、これは「Control」から継承しているためだけに存在します。 毎 その他のフォーム コントロール。ただし、TextBox クラスではオーバーライドされます (そしてプライベートに変更されたと思います)。したがって、Visual Studio の IntelliSense には表示されません。
ただし、実際には次のようにコードを書くことができます。
textBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseDown);
コンパイルして問題なく実行されますが、唯一の問題は、TextBox コントロールをタップしたときに textBox1_MouseDown() が起動されないことです。これはイベントが内部でオーバーライドされているためだと思います。イベントで内部的に起こっていることを変更するつもりはなく、独自のイベント ハンドラーをそのイベントに追加して、他のイベントと同様にカスタム コードを起動できるようにしたいだけです。
解決
あなたは正しいようですね。残念だ。MouseOver イベントはありません。
ただし、.NET で常に機能するフォールバックの 1 つは P/Invoke です。誰かがすでに時間をかけて .NET CF TextBox に対してこれを行っています。CodeProject でこれを見つけました。
http://www.codeproject.com/KB/cs/TextBox_subclassing.aspx
お役に立てれば
他のヒント
この答えがかなり遅れていることは承知していますが、これを見つけた誰かにとって役立つことを願っています。また、私自身が完全に思いついたわけではありません。ほとんどの情報は元々 OpenNETCF ボードで見つけたと思いますが、以下に入力した内容は私のアプリケーションの 1 つから抽出したものです。
OpenNETCF.Windows.Forms.IMessageFilter インターフェイスを実装し、それをアプリケーションのメッセージ フィルターに添付することで、mousedown イベントを取得できます。
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 イベントが発生したときに、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 イベント ハンドラー メソッドを必要に応じてオーバーライドできます。CF を使用して Reflector をざっと見てみると、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 によれば、 TextBox の MouseDown イベント ハンドラ サポートされています。コードを実行しようとすると何が起こるでしょうか?