2009-07-06 85 views
1

我有一個文本框,並想從另一種形式轉發按鍵響應事件。正向一個按鍵事件

到目前爲止,我有我的方式:

private readonly Action<KeyPressEventArgs> m_KeyPress; 

public KeyboardForm(Action<KeyPressEventArgs> keyPress) 
{ 
    m_KeyPress = keyPress; 
} 

protected override void OnKeyPress(KeyPressEventArgs e) 
{ 
    m_KeyPress(e); 
    base.OnKeyPress(e); 
} 

而派生文本框,初始化形式:

var keyboardForm = new KeyboardForm(OnKeyPress); 
keyboardForm.Show(); 

現在,隨着預期(該表的的OnKeyPress-方法被調用,然後是TextBox)。但儘管如此什麼也沒有發生......當我按「一」我預期的「A」出現在我的文本框...

有沒有人有一個想法,這裏有什麼問題嗎?

它不與KeyDown一起工作,並附加到常規的暴露事件KeyPress也不幫助我。我認爲,問題在於明確的呼籲OnKeyPress。它允許嗎?

+0

爲什麼downvote?這是一個很好的問題。 – 2009-07-07 03:45:07

回答

2

Form1中:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
     Form2 f = new Form2(); 
     f.mEvent += new Form2.TestEvent(f_mEvent); 
     f.Show(); 
    } 

    void f_mEvent(KeyPressEventArgs e) 
    { 
     textBox1.Text += e.KeyChar; 
    } 
} 

窗體2:

public partial class Form2 : Form 
{ 
    public delegate void TestEvent(KeyPressEventArgs e); 
    public event TestEvent mEvent; 

    public Form2() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     if (mEvent != null) 
     { 
      mEvent(e); 
     } 
     base.OnKeyPress(e); 
    } 
} 
+0

感謝您的建議。它至少適用於普通字符 - 我添加了一個檢查,如果(char.IsLetterOrDigit(e.KeyChar));但我仍然不確定爲什麼OnKeyPress()方法不能被調用。它的優點是即使是Backspace等特殊字符也會被轉發。 – tanascius 2009-07-07 07:55:26

+0

問題是表單不會自動將按鍵事件轉發到文本框本身。您可以將上面的f_mEvent更改爲: textBox1.Focus(); SendKeys.Send(e.KeyChar.ToString()); 這確實有現在偷的焦點形式的缺點,但退格將工作 – SwDevMan81 2009-07-07 11:59:31

1

這應該做你想要什麼。根據SendKey characters製作鍵盤表格上按鈕的文本。例如,如果你想要小寫字母a,只需在鍵盤按鈕文本中輸入「a」即可。如果你想要一個退格按鈕,只需把「backspace」作爲按鈕的文本。所有的鍵盤按鍵點擊事件可以爲ButtonClick功能寄存器

鍵盤形式:

public partial class KeyboardForm : Form 
{ 
    public delegate void ButtonPressed(string keyPressed); 
    public event ButtonPressed ButtonPressedEvent; 

    public KeyboardForm() 
    { 
     InitializeComponent(); 
    } 

    private void ButtonClick(object sender, EventArgs e) 
    { 
     Button button = sender as Button; 
     if (button != null) 
     { 
      if ((ButtonPressedEvent != null)) 
      { 
       ButtonPressedEvent("{"+button.Text+"}"); 
      } 
     } 
    } 
} 

與文本形式的用戶類型的東西到:

public partial class Form1 : Form 
{ 
    private KeyboardForm mKeyboardForm = new KeyboardForm(); 
    private bool mIsKeyboardCode = false; 

    public Form1() 
    { 
     InitializeComponent(); 
     mKeyboardForm.ButtonPressedEvent += new KeyboardForm.ButtonPressed(KeyboardFormButtonPressedEvent); 
    } 

    void KeyboardFormButtonPressedEvent(string keyPressed) 
    { 
     mIsKeyboardCode = true; 
     textBox1.Focus(); 
     SendKeys.SendWait(keyPressed.ToString()); 
     mKeyboardForm.Focus(); 
     mIsKeyboardCode = false; 
    } 

    private void TextBoxKeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.ControlKey) 
     { 
      if (!mKeyboardForm.Visible) 
      { 
       mKeyboardForm.Show(this); 
       e.Handled = true; 
      } 
     } 
     else if (!mIsKeyboardCode) 
     { 
      mKeyboardForm.Hide(); 
     } 
    } 
} 

注:我沒有使用擴展的文本框內有一個表單。我不認爲它是一個好的設計,可以從自定義文本框中顯示/隱藏表單。