使用.Net ComboBox属性引起的奇怪行为SelectionStart& SelectionLength在“DropDownList”模式下

时间:2009-06-03 11:43:09

标签: c# winapi exception combobox hook

我们在“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));

1 个答案:

答案 0 :(得分:1)

好的,因为没有任何建议,我会提供一些:

  1. 如果您的组合框是DropDownList,则使用SelectionStart和SelectionLength属性是不正确的。在这些情况下,CB_GETEDITSEL被发送到组合框的窗口 - 它不会返回任何可靠的东西(因为没有编辑控件来查询)。所以 - 就是不要那样做(或用try-catch包含相应的代码)!或者 - 始终检查组合框的类型。
  2. 违反先前的建议可能会导致(a)没有异常; (b)未处理的异常或异常程序终止(取决于JIT设置)。如果您的环境中安装了系统范围的WH_CALLWNDPROC挂钩,则情况(b)非常稳定。
  3. 2011年2月更新 正如我在这里的评论中提到的,只有解决方法(读 - 脏黑客)是安装你自己的相同类型的钩子(WH_CALLWNDPROC),但如果消息是你的组合框,不要调用其他钩子。是的,这太丑了。

相关问题