在 C# Windows.Forms 中,我想拦截组合框的粘贴窗口消息。由于这不能通过覆盖组合框的 WndProc 方法来实现,因为我需要覆盖组合框内文本框的 WndProc,所以我决定创建一个 NativeWindow 类型的自定义类来覆盖 WndProc。当组合框句柄被破坏时,我分配句柄并释放它。但是,当调用组合框的 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();
}
}
}