C# Windows.Forms では、コンボ ボックスの貼り付けウィンドウ メッセージをインターセプトしたいと考えています。コンボボックスの WndProc メソッドをオーバーライドしても機能しないため、コンボボックス内のテキスト ボックスの WndProc をオーバーライドする必要があるため、WndProc をオーバーライドする NativeWindow 型のカスタム クラスを作成することにしました。コンボボックス ハンドルが破棄されたら、ハンドルを割り当てて解放します。しかし、コンボボックスの Dispose が呼び出されると、無効なクロススレッド操作が発生し、コンボボックスが作成されたスレッド以外のスレッドからアクセスされたことを示す InvalidOperationException が発生するという問題があります。ここで何がうまくいかないのですか?
以下に、私のクラスがどのように見えるかを示します。
public class MyCustomComboBox : ComboBox
{
private WinHook hook = null;
public MyCustomComboBox()
: base()
{
this.hook = new WinHook(this);
}
private class WinHook : NativeWindow
{
public WinHook(MyCustomComboBox parent)
{
parent.HandleCreated += new EventHandler(this.Parent_HandleCreated);
parent.HandleDestroyed += new EventHandler(this.Parent_HandleDestroyed);
}
protected override void WndProc(ref Message m)
{
// do something
base.WndProc(ref m);
}
private void Parent_HandleCreated(object sender, EventArgs e)
{
MyCustomComboBox cbx = (MyCustomComboBox)sender;
this.AssignHandle(cbx.Handle);
}
private void Parent_HandleDestroyed(object sender, EventArgs e)
{
this.ReleaseHandle();
}
}
}