2011-08-09 61 views
1

這個簡單的問題在WinForms的.NET中多次出現。我有一個文本框,並希望將Enter鍵與Tab鍵相同,就像每當我按下Enter鍵時一樣,我想讓lostfocus被引發,下一個要聚焦的控件等等。我注意到許多類似的問題這個,我可以通過捕獲KeyDown來解決問題,並且當檢測到Enter以移動焦點時,但是我所尋找的是最佳實踐,並且如果不是爲了瞭解Textbox控件在內部檢測Tab鍵的位置以及它如何這是事情,所以我可以添加一個「||鍵== Keys.Enter」。這將阻止Keydown被提出,而是將焦點轉移到下一個控件並提出其他適當的消息。.NET解釋在文本框中輸入密鑰爲製表符

我在 .NET TextBox - Handling the Enter Key之前檢查了這個相似的問題,但這不是我真正想要完成的。我真正想做的事情是儘可能早地在文本框控件中將ENTER解釋爲TAB,或者截取並將Enter更改爲Tab,然後讓Textbox執行此操作。

編輯:這是一起什麼我要找的東西線,但我不知道該修改這樣在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 –