我们在“DropDownList”模式下为组合框提供了一个带有这种处理程序的示例应用程序:
private void comboBox1_Leave(object sender, EventArgs e)
{
comboBox1.SelectionStart = 0;
comboBox1.SelectionLength = 0;
}
上面的代码表现不同,具体取决于应用程序是否加载了CALLWNDPROC钩子。如果应用程序中有一个CALLWNDPROC挂钩 - 上面的代码会在组合框失去焦点时抛出异常。没有钩子 - 代码不会抛出。
这些是来自异常描述的几行:
System.ArgumentOutOfRangeException: InvalidArgument=Value of '-2136611475' is not valid for 'start'.
Parameter name: start
at System.Windows.Forms.ComboBox.Select(Int32 start, Int32 length)
at System.Windows.Forms.ComboBox.set_SelectionLength(Int32 value)
at ComboCrash.Form1.comboBox1_Leave(Object sender, EventArgs e) in T:\tmp.proj\ComboCrash\ComboCrash\Form1.cs:line 32
at System.Windows.Forms.Control.OnLeave(EventArgs e)
at System.Windows.Forms.Control.NotifyLeave()
at System.Windows.Forms.ContainerControl.UpdateFocusedControl()
问题是:安装了挂钩的不同行为可能是什么原因?
PS1:我不是C#开发人员,但在我看来,文本选择的概念不适用于DropDownList组合框(因为它们没有文本框),是否正确?
PS2:安装钩子和钩子DLL的应用程序是用C ++编写的。 挂钩功能非常简单:
return (CallNextHookEx(hook_handle, code, wParam, lParam));
答案 0 :(得分:1)
2011年2月更新 正如我在这里的评论中提到的,只有解决方法(读 - 脏黑客)是安装你自己的相同类型的钩子(WH_CALLWNDPROC),但如果消息是你的组合框,不要调用其他钩子。是的,这太丑了。