2016-03-10 23 views
5

düğmesine basın TextBox numaralı telefona Sekme tuşunu basmaya çalışıyorum. Ben Tab tuşu KeyDown, KeyUp veya KeyPress olayları tetiklemek etmediğini biliyoruz. Bulundum: Windows'daki BlackWasp Formlarındaki Sekme Anahtarını Internet'te Algılama. Yaptığım ProcessCmdKey'i geçersiz kılmayı önerdiler, ancak bu da tetiklenmiyor. Tab Tuşunu basmanın güvenilir bir yolu var mı?Sekme Tuşunu Algıla Metin Kutusu

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == Keys.Tab && textBox_AllUserInput.Focused) 
     { 
      MessageBox.Show("Tab key pressed.");  } 
     if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused) 
     { 
      MessageBox.Show("Shift-Tab key pressed.");  } 

     return base.ProcessCmdKey(ref msg, keyData); 
    } 

sorun Tab tuşuna basın yakalamak olmamasıdır şu şekildedir:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
{ 

    bool baseResult = base.ProcessCmdKey(ref msg, keyData); 

    if (keyData == Keys.Tab && textBox_AllUserInput.Focused) 
    { 
     MessageBox.Show("Tab key pressed."); 
     return true; 
    } 
    if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused) 
    { 
     MessageBox.Show("Shift-Tab key pressed."); 
     return true; 
    } 

    return baseResult; 
} 

Cody Gray'in önerisine göre, ben kod değişti. Böyle TAB, DÖNÜŞ, ESC ve ok tuşları olarak

sen presed olan sekme için bu kodu kullanılan olabilir
+3

Evet, ProcessCmdKey() çok güvenilirdir. Kimse bunu nasıl çözdüğünü anlatamaz. –

+0

My kodudur: korumalı yüzdesel BOOL ProcessCmdKey (ref mesajı Msg Keys keyData) { BOOL baseResult = base.ProcessCmdKey (ref MSG keyData); halinde (keyData == Keys.Tab && textBox_AllUserInput.Focused) { MessageBox.Show ("Sekme tuşuna basıldığında."); , true; } dönüş baseResult; } Tüm 3 cevapları denedim ve hiçbiri işe yaramadı. – user2102327

+0

Geçersiz kılmak için temel uygulamayı çağırmayın. Base.ProcessCmdKey (...) işlevini işlevin sonuna getirin. –

cevap

0

...

private void input_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
    { 
     //Check here tab press or not 
     if (e.KeyCode == Keys.Tab) 
     { 
      //our code here 
     } 
     //Check for the Shift Key as well 
     if (Control.ModifierKeys == Keys.Shift && e.KeyCode == Keys.Tab) { 

     } 
    } 
6

Bazı basılmasını, tipik tarafından göz ardı edilir Bazı kontroller, giriş tuşlarına basılmadığı için.

Siz bu tuş vuruşları işlemek ve giriş anahtarı olarak bunları ayarlamak için kontrol PreviewKeyDown olayı işleyebilir.

private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if(e.KeyData == Keys.Tab) 
    { 
     MessageBox.Show("Tab"); 
     e.IsInputKey = true; 
    } 
    if (e.KeyData == (Keys.Tab | Keys.Shift)) 
    { 
     MessageBox.Show("Shift + Tab"); 
     e.IsInputKey = true; 
    } 
} 
+0

Bu bir saldırıdır. Bu tuş vuruşlarını işlemek için * gerçek * yer kontrolün kendisidir. Alt sınıf TextBox ve IsInputKey geçersiz kıl. –

+0

@CodyGray Dokümanlandı. Dokümantasyondaki [açıklamalar] 'ı (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown (v = vs.110) .aspx # Anchor_1) okuyun. Bir 'Tab 'tuşunu bu şekilde halledebildiğiniz zaman, neden alt sınıflara ihtiyacınız var? –

+0

Elbette, belgelenmiş bir hack. :-) Bir daha az bir kesmek yapmaz. Alt sınıflama, kapsülleme, endişelerin ayrılması ve aralarında iyi bir tasarımın olmasını tercih etmek için birçok sebep vardır. Yeniden kullanılabilirlik başka bir ilgi çekicidir. TextBox'un bir alt sınıfı bu koddan belki 3-4 daha fazla satır alacaktır, bu büyük bir çaba değildir. –