Странное поведение, вызванное использованием свойств .Net ComboBox SelectionStart & SelectionLength в режиме «DropDownList» - PullRequest
0 голосов
/ 03 июня 2009

У нас есть пример приложения с таким обработчиком для выпадающего списка в режиме «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 Ответ

1 голос
/ 10 июня 2009

хорошо, поскольку пока нет предложений, я приведу несколько:

  1. некорректно работать со свойствами SelectionStart и SelectionLength, если ваш комбинированный список представляет собой DropDownList. В этих случаях CB_GETEDITSEL отправляется в окно комбобокса - и он не вернет ничего надежного (потому что нет запроса на редактирование для запроса). Так что - просто не делайте этого (или приложите соответствующий код с помощью try-catch)! Или - всегда проверяйте тип вашего комбинированного списка.
  2. нарушение предыдущей рекомендации может привести к (a) ничего необычного; (б) необработанные исключения или ненормальное завершение программы (в зависимости от настроек JIT). Случай (b) очень стабилен в случае, если в вашей среде установлены общесистемные хуки WH_CALLWNDPROC.

Обновление от февраля 2011 г. Как я упоминал где-то в комментариях здесь, единственным обходным решением (чтение - грязный хак) было установить собственный хук того же типа (WH_CALLWNDPROC), но не вызывать другие хуки, если сообщение предназначено для вашего выпадающего списка. Да, это безобразно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...