「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));