2008-10-10 11 views
12

मैं एक घटक बनाना चाहता हूं जो हमें विजुअल स्टूडियो आईडीई और माइक्रोसॉफ्ट ऑफिस जैसे मनमाने ढंग से कमांड से जुड़े कंपाउंड कीबोर्ड शॉर्टकट्स की अनुमति देता है।मैं विंडोज फॉर्म एप्लिकेशन में कंपाउंड कीबोर्ड शॉर्टकट कैसे बना सकता हूं?

यही कारण है, कीबोर्ड Ctrl +डब्ल्यू + सी ऐसे के रूप में कई कीस्ट्रोक्स के एक दृश्य से मिलकर शॉर्टकट, है। विजुअल स्टूडियो में यह क्लास व्यू खोलता है। जब कुंजी का पहला सेट दबाया जाता है (Ctrl + डब्ल्यू) संदेश "(Ctrl + W) दबाया गया था। तार की दूसरी कुंजी की प्रतीक्षा कर रहा है ..." स्टेटस बार में दिखाई देता है।

+0

एक कीबोर्ड शॉर्टकट तार एक एकाधिक कुंजी शॉर्टकट है। Ctrl + W, C की तरह, जो क्लास-व्यू खोलता है। जब कुंजी का पहला सेट दबाया जाता है (CTRL + W) संदेश "(CTRL + W) दबाया गया था। तार की दूसरी कुंजी की प्रतीक्षा कर रहा है ..." स्थिति स्ट्रिप में दिखाई देता है। मैं इसे बिल्कुल पुन: पेश करना चाहता हूं। – JJS

+0

मुझे WPF के लिए इसका कार्यान्वयन मिला। http://insystusa.com/Products.aspx – JJS

+0

क्या यह एक तार के * विपरीत * नहीं है? प्रस्तावित समाधान ड्रू के लिए –

उत्तर

11

कुंजीपटल chords विशेष रूप से, मैं नहीं मानता के सवाल के जवाब में इस बिंदु पर एक रेडीमेड विकल्प आपके लिए उपलब्ध नहीं है।

हालांकि, यह मॉडल के लिए काफी सरल होना चाहिए। मैं एक एकल वर्ग, शायद KeyboardChordProvider बनाउंगा। इसे फॉर्म स्तर पर कीबोर्ड घटनाओं के बारे में जानना होगा।जैसा कि कहीं और कहा गया है, Form.KeyPreview संपत्ति true होनी चाहिए। यह प्रदाता Form.KeyPress ईवेंट की सदस्यता लेने के लिए पर्याप्त हो सकता है। यदि आप फॉर्म में पास हुए हैं तो आप प्रदाता के कन्स्ट्रक्टर में यह सब कर सकते हैं।

आपको प्रदाता के साथ संभावित कीस्ट्रोक पंजीकृत करना होगा।

आंतरिक रूप से यह उदाहरण वर्तमान स्थिति को ट्रैक करेगा। जब भी एक कीस्ट्रोक मनाया जाता है जो तार की पहली कुंजी का प्रतिनिधित्व करता है, तो आप प्रदाता के राज्य को अपडेट करेंगे और एक ईवेंट बढ़ाएंगे ताकि एक ग्राहक टेक्स्ट सेट कर सके: (CTRL + W) दबाया गया था। तार की दूसरी कुंजी की प्रतीक्षा कर रहा है ...

यदि अगला कीस्ट्रोक संभावित माध्यमिक विकल्प से मेल खाता है, तो आपके पास एक मैच है और ChordPressed ईवेंट बढ़ा सकता है जिसमें स्ट्रोक का विवरण शामिल है। वैकल्पिक रूप से, आप केवल एक विशेष कॉलबैक कॉल कर सकते हैं जो प्रदाता को पंजीकृत होने पर प्रदाता को दिया गया था (स्विच स्टेटमेंट या ChordPressed इवेंट हैंडलर में कुछ अन्य प्रेषण से बचने के लिए)।

यदि किसी भी समय, एक कीस्ट्रोक संभावित अगले विकल्प से मेल नहीं खाता है, तो आप प्रदाता की स्थिति को रीसेट कर देंगे।

प्रदाता के लिए आंतरिक आप पेड़ संरचना का उपयोग कर संभावित कीस्ट्रोक मॉडल कर सकते हैं। प्रदाता की वर्तमान स्थिति सिर्फ एक विशेष पेड़ नोड है। शुरुआत में, रूट नोड सक्रिय होगा। यदि कोई बच्चा एक कीस्ट्रोक से मेल खाता है तो यह अगले स्ट्रोक की प्रत्याशा में वर्तमान नोड बन जाता है। अगर बच्चा एक पत्ता नोड था, तो एक संपूर्ण तार मिलान हो गया है और आप ChordPressed ईवेंट (स्ट्रोक की श्रृंखला को पार करते हुए उस बिंदु पर पहुंचे) उठाएंगे या पत्ते में संग्रहीत कॉलबैक का आह्वान करेंगे। जब भी कोई कीस्ट्रोक किसी बच्चे से मेल नहीं खाता है, तो रूट नोड को सक्रिय करने के लिए वापस रीसेट करें।

मुझे लगता है कि यह डिज़ाइन जो आप चाहते हैं उसे प्राप्त करेंगे।

+0

धन्यवाद। अधिक महत्वपूर्ण बात। प्रतिक्रिया के साथ आधे रास्ते नहीं जाने के लिए धन्यवाद। – JJS

+0

यहां इस इंटरफ़ेस को रिकॉर्ड करना, इसलिए मुझे बाद में अपना घटक लागू करना याद है। http://msdn.microsoft.com/en-us/library/system.windows.forms.imessagefilter.aspx – JJS

0

प्रपत्र के OnKeyPressed घटना का उपयोग करें और देखें कि क्या वांछित कुंजी संयोजन EventArgs बहस में दबाया गया था

1

मेनू नियंत्रण संपत्ति ShortCut नामित जहां एक मूल्य निर्दिष्ट कर सकते हैं। जब आप उस शॉर्टकट कुंजी को दबाते हैं, तो उस मेनू आइटम को बुलाया जाएगा। उन गुणों के लिए उस प्रॉपर्टी का उपयोग करें जिसमें संबंधित मेनू है।

यदि आपको शॉर्टकट की आवश्यकता है जो मेनू पर उपलब्ध नहीं होगा, तो आपको फॉर्म या नियंत्रण पर KeyUp या KeyDown ईवेंट के माध्यम से स्वयं को संभालना होगा। KeyEventArgs ऑब्जेक्ट आपके हैंडलर को पास कर दिया जाएगा, और आप जांच सकते हैं कि कौन सी कुंजी दबाई जाती है, और क्या Ctrl, Alt या Shift कुंजी भी दबाए गए थे। MSDN से

नमूना कोड:

// Handle the KeyDown event to determine the type of character entered into the control. 
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 
{ 
    // Initialize the flag to false. 
    nonNumberEntered = false; 

    // Determine whether the keystroke is a number from the top of the keyboard. 
    if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9) 
    { 
     // Determine whether the keystroke is a number from the keypad. 
     if (e.KeyCode < Keys.NumPad0 || e.KeyCode > Keys.NumPad9) 
     { 
      // Determine whether the keystroke is a backspace. 
      if(e.KeyCode != Keys.Back) 
      { 
       // A non-numerical keystroke was pressed. 
       // Set the flag to true and evaluate in KeyPress event. 
       nonNumberEntered = true; 
      } 
     } 
    } 
    //If shift key was pressed, it's not a number. 
    if (Control.ModifierKeys == Keys.Shift) { 
     nonNumberEntered = true; 
    } 
} 
0

कुछ उत्तर के अलावा, एक बटन, या मेनू आइटम के शीर्षक में एक ampersand का उपयोग कर, यह कारण होगा रेखांकित किया जाना है, और सुलभ का उपयोग करके Alt + अक्षर जो आप पहले से & द्वारा किया था।

दूसरे शब्दों में, अगर आपके पास एक मेनू आइटम उपर्युक्त & फ़ाइल यह एफ और उपयोगकर्ता के तहत एक ड्रॉइंग के साथ प्रदर्शित करेगा Alt + एफ क्लिक करके मेनू को गति प्रदान कर सकते हैं।

0

यह कुंजीपटल शॉर्टकट के दायरे पर निर्भर करता है। यदि आप चाहते हैं एक कुंजीपटल शॉर्टकट एक उपकरण पट्टी का उपयोग किए बिना प्रपत्र पर कोई नियंत्रण से इस्तेमाल किया जा रहा है, तो प्रपत्र पर

Form.KeyPreview = true; 

निर्धारित किया है। यह सब कुंजी दबाने घटनाओं कुंजी दबाने, KeyDown और फार्म स्तर पर KeyUp किसी घटना के समय एक भी कीबोर्ड शॉर्टकट सभी उपयोगकर्ता नियंत्रण में कार्यक्षमता डुप्लिकेट करने के बजाय एक ही स्थान में नियंत्रित किया जा करने की अनुमति देगा द्वारा फ़िल्टर करने के लिए अनुमति देगा।

MSDN: Form.KeyPreview Property

संबंधित मुद्दे

 संबंधित मुद्दे