2011-12-10 21 views
5

का उपयोग करके प्रमुख प्रेस के संयोजन को कैप्चर करना मेरा लक्ष्य एक Winforms ऐप में कस्टम सेव विधि तक वायरस करने के लिए कस्टम कंट्रोल + एस कुंजी प्रेस हैंडलर को कार्यान्वित करना है।WinForms - ProcessCmdKey VS KeyDown

मेरे आर & डी के आधार पर इसे पूरा करने के कई तरीके हैं। सबसे पहले, मैंने स्पष्ट कीप्रेस ईवेंट हैंडलर की कोशिश की। यह आवश्यक महत्वपूर्ण प्रेस को कैप्चर करने के लिए पर्याप्त शक्तिशाली नहीं था (इसे संपादक स्तर पर नहीं कहा गया था, जो मुझे चाहिए)।

दूसरा विकल्प जो बेहतर दिखता है संरक्षित ओवरराइड बूल ProcessCmdKey (रेफ संदेश संदेश, कुंजी कीटाटा) ओवरराइड है। यह काम करता है - यह CTRL कुंजी क्लिक को रोकता है, लेकिन जाहिर है, मुझे इस तथ्य को जारी रखने के लिए अतिरिक्त कोड लिखना होगा कि CTRL कुंजी दबाया गया है और अगली कुंजी प्रेस (जो मेरे मामले में एस होगा) को रोक देगा और फिर कस्टम कार्रवाई करें।

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     if (keyData == (Keys.S | Keys.Control)) 
     { 
      // This is never called 
     } 
     else if (keyData == (Keys.Menu | Keys.Alt)) 
     { 
      // this is called each time I hit CTRL 
     } 
     return true; 
    } 

ProcessCmdKey को CTRL कुंजी को हिट करने के तुरंत बाद कहा जाता है।

इस पोस्ट में एक KeyTracker वर्ग कुंजी दबाया जारी रहती है और यह क्या करने की जरूरत क्या करेंगे कि बनाने का सुझाव:

Capture Key Sequence via ProcessCmdKey

कौन सा एक अच्छा विकल्प की तरह लगता है, लेकिन इससे पहले कि मैं में खुदाई एक एक स्मृति चिन्ह लागू ट्रैकिंग पैटर्न, क्या किसी के पास इस आम तौर पर आम सुविधा को पूरा करने के लिए इनपुट है?

एक और पैटर्न का उपयोग करता GetKeyboardState एपीआई समारोह:

Capture multiple key downs in C#

यह दिलचस्प लगता है, हालांकि मुझे यकीन है कि यह मेरी जरूरतों को सूट नहीं कर रहा हूँ।

[DllImport ("user32.dll")] 

सार्वजनिक स्थैतिक बाहरी int GetKeyboardState (बाइट [] कीस्टेट);

private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
    byte[] keys = new byte[255]; 

    GetKeyboardState (keys); 

    if(keys[(int)Keys.Up] == 129 && keys[(int)Keys.Right] == 129) 
    { 
     Console.WriteLine ("Up Arrow key and Right Arrow key down."); 
    } 
} 

मेरी समस्या को देखने के लिए धन्यवाद।

अद्यतन

मैं अपने DataPanel की कुंजी से निपटने के लिए तीन घटनाओं जोड़ दिया है। जब मैं घटनाओं में ब्रेकपॉइंट्स सेट करता हूं तो इनमें से कोई भी घटना वीएस द्वारा नहीं उठाई जा रही है, इसलिए यही कारण है कि मुझे विश्वास है कि ProcessCmdKey मेरा सबसे अच्छा विकल्प है।

मैं काम करने के लिए इन घटनाओं मिल सकता है, तो उस के साथ-साथ अच्छा होगा:

 // Ctrl + S: Save Support 
     this.ParentForm.KeyPreview = true; 
     this.KeyPress    += new KeyPressEventHandler(DataPanel_KeyPress); 
     this.KeyDown    += new KeyEventHandler(DataPanel_KeyDown); 
     this.PreviewKeyDown  += new PreviewKeyDownEventHandler(DataPanel_PreviewKeyDown); 

इन घटनाओं में से कोई भी जब किसी भी कुंजी का उपयोग पकड़ा हो रहे हैं:

void DataPanel_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
    { 
     if (e.KeyCode == (Keys.S | Keys.Control)) 
     { 
      SessionManager.Trace.AddTrace("You Hit Save!!"); 
     } 
    } 

    void DataPanel_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == (Keys.S | Keys.Control)) 
     { 
      SessionManager.Trace.AddTrace("You Hit Save!!"); 
     } 
    } 

    void DataPanel_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     var key = e.KeyChar; 
    } 

अद्यतन

मैंने एक साधारण कीप ईवेंट और कीप्रेव्यू ध्वज का उपयोग करके समस्या हल कर दी है:

void ShipmentDataPanel_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.Control && e.KeyCode == Keys.S) 
     { 
      MessageBox.Show("Control + S Key Hit!"); 
     } 
    } 

धन्यवाद।

+0

के संभावित डुप्लिकेट [WinForms में कीबोर्ड शॉर्टकट लागू करने के लिए सबसे अच्छा तरीका है?] (Http://stackoverflow.com/questions/400113/best-way-to-implement -किबोर्ड-शॉर्टकट-इन-विनफॉर्म) –

उत्तर

3

हमारे फॉर्म की संपत्ति true पर सेट करें। इस संपत्ति का सारांश कहता है: "यह मानते हुए एक मान प्राप्त करता है या सेट करता है कि इस कार्यक्रम को ध्यान केंद्रित करने से पहले महत्वपूर्ण घटनाएं प्राप्त होंगी या नहीं।" फिर KeyUp ईवेंट का उपयोग करें। जब तक KeyPressed यह नियंत्रण कुंजी जैसे विशेष कुंजी पर भी जानकारी देता है।

+0

धन्यवाद - मैं अभी कोशिश करूँगा। क्या ProPreview ProcessCmdKey() ओवरराइड के साथ काम करेगा यदि आप हाथ से जानते हैं? – nocarrier

+0

वैसे, मैं डेटापैनल स्तर पर काम कर रहा हूं, इसलिए मुझे लगता है कि मैं अपने पेरेंटफॉर्म में कीप्रेव्यू प्रॉपर्टी जोड़ रहा हूं? उदाहरण: यह। माता-पिता। KeyPreview = सत्य; – nocarrier

+0

मैंने अपने प्रश्न में एक अपडेट जोड़ा है। मैंने आपके द्वारा सुझाए गए कीप्रेस ईवेंट को जोड़ा, लेकिन मेरा डेटापैनल उनसे सब्सक्राइब करना नहीं चाहता है। KeyPreview ProcessCmdKey ईवेंट को प्रभावित नहीं करता है (यह अभी भी CTRL कुंजी प्रेस पर लात मार दिया जाता है)। – nocarrier

0

मैं ऐसा करके इस हल,

if(e.KeyData==(Keys.S | Keys.Control))