मैंने Keyboard.Modifiers
के उपयोग का सुझाव देने के लिए कई उत्तरों को देखा है, यह निर्धारित करने के लिए कि KeyDown
ईवेंट एक कुंजी के लिए है जो एक संशोधक सेट था। दुर्भाग्यवश, क्योंकि Keyboard.Modifiers
वर्तमान संशोधक की स्थिति (कुंजी दबाए जाने पर संशोधक की स्थिति के बजाय) लौटाता है, इसके परिणामस्वरूप त्वरित टाइपिस्ट के लिए वास्तव में कष्टप्रद अस्थायी बग होता है।WPF KeyDown ईवेंट में संशोधक कुंजी को सही ढंग से कैसे पुनर्प्राप्त करें?
विशेष रूप से, कल्पना करें कि कोई व्यक्ति Ctrl + A दबाता है, और ए दबाए जाने के बाद केवल कुछ मिलीसेकंड को रिलीज़ करता है। अब कल्पना करें कि सिस्टम भारी भार में था; कुंजी हैंडलर ने निष्पादन शुरू कर दिया लेकिन 50 एमएमएस के लिए छूट दी गई थी। जब तक कुंजी हैंडलर फिर से निष्पादित कर रहा है, वर्तमान Ctrl की स्थिति "जारी" है। कुंजी हैंडलर अब सोचेंगे कि "ए" को Ctrl के बिना दबाया गया था, और यह खराब है।
इसी प्रकार, यदि एक तेजी से टाइपिस्ट एक में प्रवेश करती है, Ctrl + End और अपने आवेदन Keyboard.Modifiers
का उपयोग करता है, यह बजाय अवलोकन Ctrl + A लग सकती है ...
WinForms में, KeyDown
घटना मुझे Ctrl के राज्य बताता है बिल्कुल, भले ही यह पहले से ही ईवेंट द्वारा संभाला जा रहा है, तब तक इसे रिलीज़ किया गया हो। मैं WPF में यह वही व्यवहार कैसे प्राप्त कर सकता हूं?
संपादित: ऐसा लगता है कि वास्तव में Keyboard.Modifiers "वर्तमान" संशोधक कुंजियों को पुनः प्राप्त नहीं है संभव है, लेकिन जैसा कि कुंजी दबाए संदेश अभी संसाधित किया जा करने के लिए संबंधित के बजाय संशोधक कुंजियों। WinAPI में, यह "async" और गैर-async कुंजी राज्य कार्यों के बीच भेद था। दुर्भाग्यवश, the documentation का उल्लेख नहीं है कि वास्तव में "वर्तमान" का अर्थ क्या है। अगर कोई जानता है, तो कृपया ऐसा कहें।
क्या आप निश्चित हैं? मुझे msdn पर कोई संकेत नहीं मिला है, जो आपके सिद्धांत का प्रमाण देगा ... यह वास्तव में अजीब होगा कि हैंडलर-तर्कों में मूल रूप से दबाए गए कुंजी शामिल नहीं हैं ... यदि आप "ऑनकीडाउन" से जुड़ते हैं और उपयोगकर्ता नियंत्रण (पकड़) दबाता है और फिर ए, फिर नियंत्रण जारी करता है, घटना 2 बार निकाल दी जाएगी! "नियंत्रण" के साथ ही है, तो नियंत्रण + A ... साथ अजीब का एक छोटा सा पहले - imho, हम समझ सकते हैं कि आसानी से Thread.Sleep के साथ बाहर ... मैं बूट करने के लिए वी.एस. अप की क्या ज़रूरत है अभी? ;) – TheHe
@TheHe हैंडलर तर्कों में मूल रूप से दबाए गए _key_ शामिल हैं, लेकिन संशोधक कुंजी जानकारी नहीं। अच्छे पुराने WinAPI में, संशोधक कुंजी संदेश के साथ पारित कर रहे हैं। WinForms में भी ऐसा ही होता है। दस्तावेज़ वास्तव में आपको चेतावनी देता है कि _current_ स्थिति को आजमाएं और संसाधित न करें; उदाहरण के लिए, यदि एप्लिकेशन किसी भी कारण (जैसे एचडीडी थ्रैशिंग) के लिए उत्तरदायी नहीं था, तो इस तथ्य के बाद हैंडलर को _seconds_ लगाया जा सकता है। –