2009-10-30 20 views
10

मुझे के बावजूद साल के लिए के साथ सी # (Windows Forms) काम कर रहा है, मैं एक मस्तिष्क पल असफल हो रही हैं और न मुझे के जीवन के लिए पता लगा सकते हैं कि कैसे Ctrl टाइपिंग एक उपयोगकर्ता को पकड़ने के लिए + सी एक टेक्स्टबॉक्स में।एक पाठ बॉक्स में Ctrl + C पकड़ने

मेरा आवेदन मूल रूप से एक टर्मिनल अनुप्रयोग है, और मैं Ctrl +सी क्लिपबोर्ड पर प्रतिलिपि करें के लिए शॉर्टकट एक सीरियल पोर्ट के लिए एक (byte)3 भेजने के लिए, बजाय होना चाहते हैं।

मैंने शॉर्टकट enabled संपत्ति को टेक्स्टबॉक्स पर गलत पर सेट किया है। फिर भी जब उपयोगकर्ता Ctrl + सी हिट करता है, तो कुंजीपटल ईवेंट आग नहीं आता है।

अगर मैं keydown पकड़ने, घटना आग जब उपयोगकर्ता प्रेस Ctrl (अर्थात, इससे पहले कि वे सी कुंजी हिट)।

शायद यह कुछ बेवकूफ सरल है जो मुझे याद आ रही है। इसके अलावा

if (e.Control && e.KeyCode == Keys.C) { 
    //... 
    e.SuppressKeyPress = true; 
} 

, अंतर्निहित पाठ बॉक्स द्वारा कीस्ट्रोक प्रसंस्करण को रोकने के लिए:

उत्तर

32

आगे बढ़ो और KeyDown घटना उपयोग करें, लेकिन दोनोंCtrl और सी के लिए है कि घटना की जांच में है, इसलिए की तरह दिखाए गए अनुसार SuppressKeyPress प्रॉपर्टी को सही पर सेट करें।

+0

स्वीकृत के रूप में यह पहले से काम कर प्रतिक्रिया थी। बहुत धन्यवाद। - मैंने अंततः इसे समझ लिया - मेरा अपना जवाब देखें। – Bryan

+0

मुझे पता है, यह थोड़ी देर हो गया है, लेकिन भविष्य में इसे ढूंढने वालों के लिए: Shift-Insert अभी भी संभाला जा रहा है, इसलिए आपको (e.Shift && e.KeyCode == Keys.Insert) सत्यापन जोड़ने की आवश्यकता है। इसके अलावा उपयोगकर्ता अभी भी मैदान पर राइट-क्लिक कर सकते हैं और पेस्ट का चयन कर सकते हैं ... तो 100% सबूत नहीं। – trailmax

1

निम्नलिखित का प्रयास करें: ऊपर तीर और नीचे तीर घटनाओं पर कब्जा। जब आप CTRL के लिए नीचे तीर का पता लगाते हैं, तो ध्वज सेट करें; जब आप ऊपर तीर का पता लगाते हैं, तो ध्वज को रीसेट करें। यदि आप ध्वज सेट करते समय सी कुंजी का पता लगाते हैं, तो आपके पास Ctrl + सी है।

संपादित करें। ओह ... जय का जवाब निश्चित रूप से बेहतर है। :-)

6

प्रमुख घटनाओं निम्नलिखित क्रम में होते हैं:

  1. KeyDown
  2. कुंजी दबाने
  3. KeyUp

कुंजी दबाने घटना noncharacter कुंजी द्वारा नहीं उठाया है; हालांकि, noncharacter कुंजी कुंजीडाउन और कीप घटनाओं को बढ़ाते हैं। नियंत्रण एक गैर-कैरेक्टर कुंजी है।

आप कोड की इस पंक्ति के साथ जांच कर सकते हैं: if (e.KeyData == (Keys.Control | Keys.C))

3

डी 'ओह! बस इसे समझ लिया। तीन संभावित घटनाओं में से, जिसने मैंने कोशिश नहीं की है वह मुझे चाहिए!KeyUp घटना महत्वपूर्ण है:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
+1

ठीक है आप सभी ने मुझे इसे हरा दिया। KeyDown मेरे लिए काम नहीं कर रहा था, क्योंकि मैं घटनाओं को पकड़ने के लिए ब्रेक पॉइंट का उपयोग कर रहा था। हालांकि यह KeyUp पर ठीक काम करता है, इसलिए मैं इस घटना पर क्यों बस गया। – Bryan

5

मैं KeyDown द्वारा एक TextBox पर Ctrl +सी पकड़ने एक समस्या थी। मुझे केवल Control कुंजी मिली जब Control और C दोनों दबाए गए थे। समाधान PreviewKeyDown उपयोग कर रहा था:

private void OnLoad() 
{ 
    textBox.PreviewKeyDown += OnPreviewKeyDown; 
    textBox.KeyDown += OnKeyDown; 
} 

private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Control) 
    { 
     e.IsInputKey = true; 
    } 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.C) { 
     textBox.Copy(); 
    } 
} 
+0

सच नहीं है, कुंजीपटल घटना पकड़ने का सही समाधान है। – TarmoPikaro

1

मैं क्योंकि नए संस्करण में या क्योंकि कुछ परिवर्तन मैं ListBox पर इस का उपयोग करने की कोशिश कर रहा हूँ पता नहीं है अगर यह है, लेकिन वहाँ KeyEventArgs e कि मैं KeyDown से प्राप्त करने में कोई e.Control है।

मैं समाधान के आसपास काम करने के लिए किया था, मैं (यह सबसे सुंदर एक नहीं है, लेकिन यह ठीक काम करता है) इस के साथ आया था:

private List<Key> KeyBuff = new List<Key>(); 

private void ListBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!KeyBuff.Exists(k => k == e.Key)) 
     KeyBuff.Add(e.Key); 

    if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) && 
     KeyBuff.Exists(k => k == Key.C)) 
    { 
     // Desired detection 
     Clipboard.SetText(SelectedText); 
    } 
} 

private void ListBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    KeyBuff.Clear(); 
} 
संबंधित मुद्दे