2009-06-03 5 views
0

Wir mit solchen Handler eine Beispielanwendung haben für eine Combobox in „Dropdownlist“ -Modus:seltsame Verhalten verursacht durch .NET ComboBox Eigenschaften Selection & SelectionLength in „Dropdownlist“ -Modus

private void comboBox1_Leave(object sender, EventArgs e) 
    { 
     comboBox1.SelectionStart = 0; 
     comboBox1.SelectionLength = 0; 
    } 

den obigen Code verhält sich anders, je ob die Anwendung CALLWNDPROC-Hook geladen hat oder nicht Wenn die Anwendung über einen CALLWNDPROC-Hook verfügt, würde der obige Code eine Ausnahme auslösen, wenn die Combobox den Fokus verliert. Ohne den Haken - dieser Code wirft nicht.

das sind einige Zeilen von Ausnahmebeschreibung:

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() 

Die Frage ist: Was könnte die Ursache dieses unterschiedliche Verhalten mit einem Haken sein installiert?

PS1: Ich bin kein C# -Entwickler, aber es scheint mir, dass das Konzept der textuellen Auswahl nicht für DropDownList-Comboboxen anwendbar ist (da sie keine Textbox haben), ist es korrekt?

PS2: Anwendung, die den Hook und eine Hook-DLL installiert, werden in C++ geschrieben. Hook-Funktion ist so einfach wie:

return (CallNextHookEx(hook_handle, code, wParam, lParam)); 

Antwort

1

ok, da es keine Vorschläge noch ist wir einige bieten werden:

  1. es nicht korrekt ist mit Selection und SelectionLength Eigenschaften zu arbeiten, wenn Ihre Combobox ist eine DropDownList. In diesen Fällen wird CB_GETEDITSEL an das Fenster der Combobox gesendet - und es wird nichts Verlässliches zurückgegeben (weil es kein Bearbeitungssteuerelement zum Abfragen gibt). Also - tue das einfach nicht (oder füge entsprechenden Code mit try-catch bei)! Oder - überprüfen Sie immer den Typ Ihrer Combobox.
  2. Eine Verletzung der vorherigen Empfehlung könnte (a) nichts Ungewöhnliches zur Folge haben; (b) eine unbehandelte Ausnahme oder eine abnormale Programmbeendigung (abhängig von den JIT-Einstellungen). Fall (b) ist sehr stabil, wenn systemweite WH_CALLWNDPROC-Hooks in Ihrer Umgebung installiert sind.

Aktuelle Stand Februar 2011 Wie ich bereits erwähnt irgendwo in den Kommentaren hier nur Abhilfe (lesen - dirty Hack) war Ihren eigenen Haken des gleichen Typs (WH_CALLWNDPROC) zu installieren, aber ruf nicht andere hakt, wenn die Nachricht für Ihre Combobox ist. Ja, es ist hässlich.