2010-07-21 14 views
6

नहीं पहुंच रही हैं मूल रूप से, मेरे पास एक कस्टम नियंत्रण वाला एक रूप है (और कुछ और नहीं)। कस्टम नियंत्रण पूरी तरह खाली है, और फ़ॉर्म में KeyPreview को सत्य पर सेट किया गया है।तीर कुंजी घटनाएं

इस सेटअप के साथ, मुझे किसी तीर कुंजी या टैब के लिए कोई भी कुंजीडाउन ईवेंट नहीं मिल रहा है। मेरे कीबोर्ड पर मौजूद हर दूसरी कुंजी काम करता है। मेरे पास कुंजीडाउन इवेंट हैंडलर हैं जो इस तरह की घटनाओं में सबकुछ लगाते हैं, इसलिए मुझे यकीन है कि मुझे कुछ भी याद नहीं है।

यह भी ध्यान में है कि अगर मैं (पूरी तरह खाली) कस्टम नियंत्रण को हटा देता हूं, तो मुझे तीर कुंजी घटनाएं मिलती हैं।

पृथ्वी पर क्या चल रहा है?

संपादित करें:

मैं दोनों फार्म और नियंत्रण को यह कहा, लेकिन मैं अभी भी तीर कुंजी हो रही नहीं कर रहा हूँ:

protected override void WndProc(ref Message m) { 
    switch (m.Msg) { 
     case 0x100: //WM_KEYDOWN 
      //this is the control's version. In the form, it's this.Text 
      ParentForm.Text = ((Keys)m.WParam).ToString(); 
      break; 
    } 
    base.WndProc(ref m); 
} 

मैं भी जासूस के साथ ++ जाँच की, और निर्धारित किया है कि प्रपत्र पर ही किसी भी WM_KEYDOWN संदेश नहीं मिल रहे हैं, वे सभी नियंत्रण में जा रहे हैं। हालांकि, यह कहा गया है कि नियंत्रण तीर कुंजी WM_KEYDOWN संदेश प्राप्त कर रहा है। आह।

संपादित करें 2: मैंने इस संस्करण के साथ ज़िप फ़ाइल भी अपडेट की है। कृपया इसे देखेंगे, तो आपको मदद करना चाहते हैं ...

संपादित करें 3:

मैं इस समझ गए होंगे, एक तरह से। यह फार्म तीर कुंजी खा रहा है, शायद अपने बच्चों के बीच ध्यान बनाए रखने के प्रयास में। यह इस तथ्य से साबित होता है कि अगर फॉर्म खाली है तो मुझे घटनाएं मिलती हैं।

public override bool PreProcessMessage(ref Message msg) { 
    switch (msg.Msg) { 
     case 0x100: //WM_KEYDOWN 
      return false; 
    } 
    return base.PreProcessMessage(ref msg); 
} 

जब मैं इसे ओवरराइड, प्रपत्र अपने गंदे काम करने के लिए एक मौका नहीं मिलता है, और इसलिए:

वैसे भी, अगर मैं रूप में यह कोड शामिल है, मैं घटनाओं फिर से शुरू हो मुझे उम्मीद है कि मेरी कुंजीडाउन घटनाएं मिलती हैं। मुझे लगता है कि इसका एक दुष्प्रभाव यह है कि अब मैं फॉर्म को नेविगेट करने के लिए अपने कीबोर्ड का उपयोग नहीं कर सकता (इस मामले में एक बड़ा सौदा नहीं है, क्योंकि यह एक गेम है, और इस अभ्यास का पूरा उद्देश्य कीबोर्ड नेविगेशन को कार्यान्वित करना है!)

सवाल अब भी यह कैसे "ठीक से" निष्क्रिय करने के लिए के बारे में बनी हुई है, अगर वहाँ एक तरीका है ...

+0

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

उत्तर

10

मैंने कुछ व्यापक परीक्षण किया है, और मैंने सब कुछ पता लगाया है।I wrote a blog post detailing the solution.

संक्षेप में, आप के रूप में ProcessDialogKey विधि ओवरराइड करना चाहते:

protected override bool ProcessDialogKey(Keys keyData) { 
    return false; 
} 

यह तीर कुंजी (और टैब) सामान्य KeyDown घटनाओं के रूप में वितरित किए जाने का कारण होगा। तथापि! यह असफल होने के लिए सामान्य संवाद कुंजी कार्यक्षमता (नियंत्रण को नेविगेट करने के लिए टैब का उपयोग करके) का भी कारण बन जाएगा। आपको लगता है कि आपके पास होंगे, लेकिन अभी भी KeyDown घटना प्राप्त करना चाहते हैं, इस का उपयोग करें:

protected override bool ProcessDialogKey(Keys keyData) { 
    OnKeyDown(new KeyEventArgs(keyData)); 
    return base.ProcessDialogKey(keyData); 
} 

यह एक KeyDown संदेश वितरित कर देगा, जबकि अभी भी सामान्य बातचीत नेविगेशन कर।

+0

के परिणामों के साथ ओपी को अपडेट किया है। – Carra

+0

धन्यवाद! अच्छी तरह से काम! –

+0

आपका ब्लॉग लिंक मर चुका है?! –

0

तो फोकस आपकी समस्या है, और आप एक ध्यान लेने के लिए और इसे रखने के लिए अपने उपयोगकर्ता नियंत्रण नहीं मिल सकता है , एक साधारण कार्य-आसपास समाधान आपके द्वारा उस महत्वपूर्ण घटना पर आपके उपयोगकर्ता नियंत्रण पर ईवेंट को गूंजना होगा। अपने फॉर्म कीडाउन या कीप्रेस ईवेंट की सदस्यता लें और फिर उस ईवेंट को अपने उपयोगकर्ता नियंत्रण में एक ईवेंट बढ़ाएं।

तो अनिवार्य रूप से, Form1_KeyPress फॉर्म 1_KeyPress से प्रेषक और ईवेंट तर्क के साथ UserControl1_KeyPress को कॉल करेगा।

protected void Form1_KeyPress(object sender, KeyEventArgs e) 
{ 
    UserControl1_KeyPress(sender, e); 
} 

अन्यथा, आप लंबे मार्ग लेने के लिए और आप इच्छा कार्यक्षमता प्राप्त करने के लिए अपने WndProc घटनाओं ओवरराइड करने के लिए हो सकता है।

+0

UserControl खाली है, और फोकस (AFAIK) प्राप्त नहीं कर सकता है। तो, फॉर्म खुद को KeyDown घटनाओं को प्राप्त करना चाहिए। हालांकि, यह नहीं है। जैसा कि मैंने इस सवाल में कहा है, मेरे पास इवेंट हैंडलर हैं जो घटना के हर चीज पर लगा हुआ है, लेकिन घटना को कुछ भी नहीं मिल रहा है। मैं WndProc को ओवरराइड करने का प्रयास कर सकता हूं, लेकिन मुझे वास्तव में नहीं होना चाहिए ... –

+0

मैंने अपने ओवरराइडिंग WNDProc –

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