2011-08-09 6 views
1

この単純な問題は、.NETでWinFormsを使用して何度も繰り返されます。私はテキストボックスを持っており、Enterキーを押すたびにlostfocusを上げたい、次のコントロールをFocusedにするなど、EnterキーをTabキーと同じように扱いたいと思います。この問題を解決するには、KeyDownをキャプチャしてEnterキーを押してフォーカスを移動することができますが、私が探しているのはベストプラクティスです.TextboxコントロールがTabキーを内部的に検出する場所と、私はちょうど "||キー== Keys.Enter"を追加することができますか?これにより、Keydownの発生を停止し、代わりにフォーカスを次のコントロールに移動し、他の適切なメッセージを生成します。.NET Enterキーをテキストボックスのタブとして解釈する

.NET TextBox - Handling the Enter Keyの前にこの同様の質問を確認しましたが、実際に達成したいことではありません。私が本当にやりたいことは、可能な限り早く、テキストボックスコントロールでTABとしてENTERを解釈するか、タブに入力してテキストボックスに変更させて変更することです。

編集:ここではこれがないかもしれ私が探しているものの線に沿って何かだが、私はこのようなWindowsのメッセージを変更する「安全」わからないんだけど...

class FancyTextBox : TextBox 
{ 
    public bool TreatEnterAsTab { get; set; } 
    const int WM_KEYDOWN = 0x100; 
    const int KEY_TAB= 9; 
    const int KEY_ENTER = 13; 

    public override bool PreProcessMessage(ref Message msg) 
    { 
     if (TreatEnterAsTab && msg.Msg == WM_KEYDOWN && msg.WParam.ToInt32() == KEY_ENTER) 
      msg.WParam = new IntPtr(KEY_TAB); 

     return base.PreProcessMessage(ref msg); 
    } 
} 

答えて

2

これは問題ありません。テキストボックスが複数行の場合や、Shiftキー、Altキー、またはCtrlキーが押されていない場合は、ほんの少しの詳細があります。デフォルトでオンにしているので、それを使用している理由は次のとおりです。

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

class FancyTextBox : TextBox { 
    public FancyTextBox() { 
     TreatEnterAsTab = true; 
    } 
    [DefaultValue(true)] 
    public bool TreatEnterAsTab { get; set; } 

    public override bool PreProcessMessage(ref Message msg) { 
     if (TreatEnterAsTab && (!this.Multiline || this.AcceptsReturn) && 
      Control.ModifierKeys == Keys.None && 
      msg.Msg == WM_KEYDOWN && (Keys)msg.WParam.ToInt32() == Keys.Enter) { 
       msg.WParam = (IntPtr)Keys.Tab; 
     } 
     return base.PreProcessMessage(ref msg); 
    } 
    private const int WM_KEYDOWN = 0x100; 
} 
+0

クリーンアップをありがとう。私はsystem.windows.forms.messageをこのように修正することは受け入れられるとは確信していませんでしたが、TextBoxをサブクラス化することを除いて、最もきれいに見えます。 – deepee1

2

あなたが探しているものですが、私が過去に行ったことは、KeyPressイベントの入力を確認し、Control.SelectNextControlを使用して既存のタブシーケンスを使用することです。

+0

ええ、私もそれをやったことがありますが、バッターの方法があるようです。 – deepee1

+0

私が知っている唯一の他の方法は、WindowProcレベルでインターセプトすることです。http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx –

関連する問題