2009-07-08 7 views
0

Winformsアプリケーションで、テキスト選択を変更せずにアプリケーションのいくつかの状態でクリックできるようにする複数行のテキストボックスがあります。C#Winformsテキストボックスのマウスクリックイベントを抑制する

私はまだMouseDown(またはClick)イベントを購読したいと思うので、テキスト選択をそれに反応させたくありません。

私は、MouseEventArgsのHandledまたはCancelプロパティを期待していましたが、悲しいことに、Noです。

私は選択変更イベントを聞いて、必要に応じてリセットしようとしましたが、これは選択変更イベントの前に現在の選択を覚えておく必要があるため、ちょっとハック感があります。誰もそれより良い提案はありますか?

答えて

9

System.Windows.Forms.Textboxから継承した独自のテキストボックスを作成し、WndProcをオーバーライドすることができます。

WndProcは、オペレーティングシステム、電源メッセージ、入力などのすべてに関するメッセージを受け取る最初のメソッドです。メソッドの名前は、Win32(およびWin16)日の後半にある2つの主な機能実装するのは "WndProc"またはWindowsのプロシージャです。

このようにすると、イベントが基本実装にディスパッチされる前に、マウス(または他のメッセージ)のウィンドウメッセージをインターセプトできるようになりました。

以下の例では、左ボタンを押し下げたり、上に移動したり、ダブルクリックしてベースコントロールを処理したりしません。

public partial class MyTextBox : TextBox 
{ 
    int WM_LBUTTONDOWN = 0x0201; //513 
    int WM_LBUTTONUP = 0x0202; //514 
    int WM_LBUTTONDBLCLK = 0x0203; //515 

    public MyTextBox() 
    { 
     InitializeComponent(); 
    } 

    protected override void WndProc(ref Message m) 
    { 

     if (m.Msg == WM_LBUTTONDOWN || 
      m.Msg == WM_LBUTTONUP || 
      m.Msg == WM_LBUTTONDBLCLK // && Your State To Check 
      ) 
     { 
      //Dont dispatch message 
      return; 
     } 

     //Dispatch as usual 
     base.WndProc(ref m); 
    } 
} 

だけの事はあなたの状態がメッセージかに渡すときを決定するためにチェックを追加して行うことを残しました。

処理するWindowsメッセージのリストは、hereです。

+0

非常に良い、ありがとう、私はネットの下にドリルする必要があることを知っていたスタック – johnc

+0

まだ私にマウスイベントargsを取得しないが、私このソリューションのようにして回避することができます – johnc

+0

マウスイベントargsを渡し、同じイベントハンドラをフォームで使用するテキストボックスに追加イベントを追加することができます。 このようにして、デフォルトのマウス操作の実装を回避することができます。 –

0

レイヤー上に透明パネルを重ねます。

+0

私もそれを考慮しましたが、それは同じようにクールジーと感じました。とにかく、BackColorのように透明ではありませんが、 – johnc

+0

は透明ですが、選択変更イベントをロールバックするよりも簡単かもしれません。私は何かが欠けている可能性があります – johnc

1

Enterイベントを処理し、このイベントで別のコントロールにフォーカスを設定する方法はありますか?しかし、あまりにも少ないコードで、かなり "ハックのような"ものです。

+0

それは醜いですが、それは動作するように見える、私はダミーの空のラベルに焦点を当てた後、私の機能をエンターイベントに移動する必要があります。私はまだ答えとしてこれを受け入れるつもりはない、私はより良い提案がない限り、ありがとう – johnc

+0

実際には、私はマウスイベントの引数が必要です。 Dammit – johnc

+0

私はまだそれを受け入れていないためにあなたを責めません。私は誰も良いアイデアを持っているかどうかを見るためにこの1つを見ています:) – marcc

関連する問題