0

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

1 に答える 1

1

わかりました。まだ提案がないので、いくつか提供します。

  1. コンボボックスがDropDownListの場合、SelectionStartプロパティとSelectionLengthプロパティを操作するのは正しくありません。このような場合、CB_GETEDITSELはコンボボックスのウィンドウに送信されます。信頼できるものは返されません(クエリする編集コントロールがないため)。だから-それをしないでください(または対応するコードをtry-catchで囲んでください)!または-コンボボックスのタイプを常に確認してください。
  2. 以前の推奨事項に違反すると、次の結果になる可能性があります。(b)未処理の例外またはプログラムの異常終了(JIT設定による)。システム全体のWH_CALLWNDPROCフックが環境にインストールされている場合、ケース(b)は非常に安定しています。

2011年2月の更新 ここのコメントのどこかで述べたように、回避策(read --dirty hack)は、同じタイプの独自のフック(WH_CALLWNDPROC)をインストールすることだけでしたが、メッセージがコンボボックス用である場合は他のフックを呼び出さないでください。はい、醜いです。

于 2009-06-10T10:10:45.440 に答える