• ベストアンサー

リストボックスの選択項目をさらにクリック

こんにちは。 C#+.NetFramework3.5で開発しています。 リストボックスを使っているのですが、リストボックスの選択されている項目をさらにクリックした場合を検出したいのです。 イベントは、 Click MouseClick MouseDown を試してみましたが、どれも選択項目が変化したあとに呼び出されるため、目的を達することができません。 選択項目が変化する前に発生するイベントはないのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  此れはリストボックスをサブクラス化して、WM_LBUTTONDOWNを引っ掛けるしか道はなさそうです。  其れにはNativeWindowクラスを継承して、WndProcメソッドをオーバーライドします。  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.nativewindow(VS.80).aspx  当方も初めて試したのですが、以下で目的は達成出来ると思います(二度目のクリック確認用にメッセージボックスを出していたのですが、WndProc内でモーダルすると、リストボックスのフォーカスがおかしくなるので省いています)。  参考程度になれば。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { ListBoxProc listBoxProc; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.listBoxProc = new ListBoxProc(this.listBox1); } } //サブクラス化用のクラス public class ListBoxProc : NativeWindow { const UInt32 WM_LBUTTONDOWN = 0x201; ListBox listBox; public ListBoxProc(ListBox listBox) { this.listBox = listBox; //ココでフックがかかる this.AssignHandle(this.listBox.Handle); } protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONDOWN) { UInt32 lParam = (UInt32)m.LParam; Point point = new Point(); point.X = (Int32)(lParam & 0xffff); point.Y = (Int32)(lParam >> 16); //マウス座標からアイテム番号へ変換 Int32 index = this.listBox.IndexFromPoint(point); //有効なアイテム番号だった if (index != -1) { //このアイテム番号は選択されている if (this.listBox.SelectedIndex == index) { //ココにくる } } } base.WndProc(ref m); } } }

titokani
質問者

お礼

なるほど、C#+.Netでのサブクラス化はこうするのですね。 試してみます。ありがとうございました。

すると、全ての回答が全文表示されます。

関連するQ&A