2016-03-10 8 views
5

में टैब कुंजी प्रेस का पता लगाएं मैं टैबTextBox में कुंजी प्रेस का पता लगाने की कोशिश कर रहा हूं। मुझे पता है कि टैब कुंजी KeyDown, KeyUp या KeyPress ईवेंट ट्रिगर नहीं करती है। मैंने पाया: इंटरनेट में ब्लैकवॉप्स के विंडोज फॉर्म में टैब कुंजी का पता लगाना। वे ProcessCmdKey को ओवरराइड करने का सुझाव देते हैं, जो मैंने किया था, लेकिन यह या तो ट्रिगर नहीं होता है। क्या टैब कुंजी प्रेस का पता लगाने का कोई विश्वसनीय तरीका है?टेक्स्टबॉक्स

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); 
    } 

समस्या यह है कि यह टैब कुंजी प्रेस पर कब्जा नहीं करता है:

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; 
} 

कोड़ी ग्रे के सुझाव के अनुसार, मैं इस प्रकार कोड बदल दिया है।

+3

हां, ProcessCmdKey() बहुत विश्वसनीय है। कोई भी नहीं बता सकता कि आपने इसे कैसे फेंक दिया। –

+0

मेरा कोड है: संरक्षित ओवरराइड बूल ProcessCmdKey (रेफ संदेश संदेश, कुंजी कीटाटा) { बूल baseResult = base.ProcessCmdKey (रेफ संदेश, कीटाटा); यदि (keyData == Keys.Tab && textBox_AllUserInput.Focused) { संदेशबॉक्स। दिखाएं ("टैब कुंजी दबाया गया।"); सच वापसी; } वापसी आधार परिणाम; } मैंने सभी 3 उत्तरों की कोशिश की और कोई भी काम नहीं करता। – user2102327

+0

यदि आप इसे ओवरराइड करने जा रहे हैं तो बेस कार्यान्वयन को कॉल न करें। फ़ंक्शन के अंत में 'base.ProcessCmdKey (...) 'ले जाएं। –

उत्तर

0

आप इस कोड टैब के लिए presed कर रहे हैं इस्तेमाल किया जा सकता है ...

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

कुछ प्रमुख इस तरह के टैब, रिटर्न, ESC, और तीर कुंजी के रूप में प्रेस,, आम तौर पर इन पर ध्यान नहीं कुछ नियंत्रण क्योंकि उन्हें इनपुट कुंजी प्रेस नहीं माना जाता है।

आप उन महत्वपूर्ण स्ट्रोक को संभालने के लिए अपने नियंत्रण की PreviewKeyDown ईवेंट को संभाल सकते हैं और उन्हें इनपुट कुंजी के रूप में सेट कर सकते हैं।

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

यह एक हैक है। उन महत्वपूर्ण स्ट्रोक को संभालने के लिए * वास्तविक * स्थान नियंत्रण में ही है। सबक्लास टेक्स्टबॉक्स और IsInputKey ओवरराइड करें। –

+0

@ कोडीग्रे यह दस्तावेज है। [टिप्पणियां] पढ़ें (https://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown (v = vs.110) .aspx # Anchor_1) प्रलेखन में अनुभाग। जब आप 'टैब' कुंजी को इस तरह से संभाल सकते हैं तो आपको उप-वर्ग क्यों करना होगा। –

+0

निश्चित रूप से, यह एक दस्तावेज हैक है। :-) इसे किसी भी हैक को कम नहीं करता है। Subclassing, encapsulation, चिंताओं को अलग करने, और उनके बीच प्रमुख डिजाइन प्रमुख पसंद करने के कई कारण हैं। पुन: प्रयोज्यता एक और आकर्षक चिंता है। टेक्स्टबॉक्स का एक उप-वर्ग इस कोड की तुलना में 3-4 और लाइन लेगा, यह शायद ही एक बड़ा प्रयास है। –