重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

こんにちは。
C#+.NetFramework3.5で開発しています。

リストボックスを使っているのですが、リストボックスの選択されている項目をさらにクリックした場合を検出したいのです。

イベントは、
Click
MouseClick
MouseDown
を試してみましたが、どれも選択項目が変化したあとに呼び出されるため、目的を達することができません。
選択項目が変化する前に発生するイベントはないのでしょうか?

よろしくお願いします。

A 回答 (1件)

 こんばんは。



 此れはリストボックスをサブクラス化して、WM_LBUTTONDOWNを引っ掛けるしか道はなさそうです。

 其れにはNativeWindowクラスを継承して、WndProcメソッドをオーバーライドします。
 http://msdn.microsoft.com/ja-jp/library/system.w …

 当方も初めて試したのですが、以下で目的は達成出来ると思います(二度目のクリック確認用にメッセージボックスを出していたのですが、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);
}
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/14 10:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!