2009-09-02 4 views
6

मैं यह जांचने की कोशिश कर रहा था कि Alt कुंजी दबाया गया था या नहीं।सी # कुंजी गणना उलझन में: Keys.Alt या Keys.RButton | Keys.ShiftKey | Keys.Alt

मैं एक चेक के समान था:

private void ProcessCmdKey(Keys keyData) 
{ 
if (keyData == Keys.Alt) 
{ 
    System.Console.WriteLine ("Alt Key Pressed"); 
} 
} 

फिर भी जब मैं breakpointed जब मैं Alt दबाया था कुंजी डिबगर मुझे बताया महत्वपूर्ण यह है कि दबाया गया था वास्तव में Keys.RButton था कहने की | Keys.ShiftKey | Keys.Alt

क्या कोई आगे बढ़ रहा है या शायद मुझे एक ऐसे लेख पर इंगित कर सकता है जो समझा सकता है?

धन्यवाद FZ

संपादित करें: मैं अभी भी एक सा क्यों Enum अन्य बिट मूल्यों की स्थापना की है के लिए होता है के रूप में खो रहा हूँ और नहीं बस Alt कुंजी? मैं समझता हूं कि enum में झंडे के साथ 1 से अधिक राज्य शामिल हो सकते हैं लेकिन मुझे यकीन नहीं है कि अगर मैंने दबाया तो यह क्यों Alt था?

+2

मुझे उत्सुकता है कि उन झंडे हमेशा क्यों सेट होते हैं। एक बग की तरह लगता है। – stone

उत्तर

6

यदि आप जांच करना चाहते हैं कि Altदबाए गए कुंजियों के भाग है, तो आप थोड़ा सा परीक्षण कर सकते हैं;

if((keyData & Keys.Alt) == Keys.Alt) {...} 
+1

मुझे इसे मारो ... – Donut

+1

कोडिंग परिप्रेक्ष्य से कौन सा बेहतर है? == Keys.Alt या! = 0? –

+1

"== Keys.Alt" सबसे अच्छा रूप है। किसी भी मामले में जहां मूल्य (इस मामले में Keys.Alt) एक बिट बिट मान नहीं है, तो! = 0 परीक्षण झूठी सकारात्मक देगा। यद्यपि इस सीई में कोई फर्क नहीं पड़ता है, यह सटीक होने का बेहतर अभ्यास है ताकि आप कभी भी ऐसे मामले से पकड़े न जाएंगे जहां! = 0 असफल हो जाएगा। –

4

कुंजी Flags Enumeration है। इसका मतलब है कि किसी दिए गए समय में एक से अधिक मूल्य हो सकते हैं। आपको इसे इस तरह देखना चाहिए:

if ((keyData & Keys.Alt) == Keys.Alt) 
{ 
    // Alt was pressed! 
} 
+0

ओपी के प्रश्न का उत्तर नहीं देता –

+0

@ एक्सेल कोस्टसपेना यकीन नहीं है कि मैं सहमत हूं - यह बताता है कि समस्या क्यों मौजूद है, और दिखाती है कि इसे सही तरीके से कैसे जांचें। आपको और क्या चाहिए? –

+0

शीर्षक: "सी # कुंजी गणना उलझन में: Keys.Alt या Keys.RButton | Keys.ShiftKey | Keys.Alt"। बॉडी रेज़्यूमे: "वैसे भी कहने की जरूरत नहीं है जब मैंने Alt कुंजी दबाया था जब डीबगर ने मुझे दबाया था कि वास्तव में कुंजी थी। आरबटन | की .ShiftKey | Keys.Alt। क्या कोई भी जा रहा है पर कुछ प्रकाश डाल सकता है पर या शायद मुझे एक लेख को इंगित करें जो समझा सकता है? " भूत कीप्रेस की घटना को समझाया नहीं गया है, केवल एक कामकाज प्रदान किया गया है। –

1

ध्वज के साथ Enum बिट्स का उपयोग करके लागू किया जाता है। आप आपरेशन के दौरान सही (माउस बटन) शिफ्ट कुंजी के साथ दबाने रहे हैं,/हाइलाइट कुछ चुनने के लिए है, जबकि डिबगिंग: http://msdn.microsoft.com/en-us/library/cc138362.aspx

संपादित करें -
एक अच्छी शुरुआत के लिए यह लिंक देखें?

+0

मैं अभी भी थोड़ा सा खो गया हूं कि क्यों ENUM के पास अन्य बिट मान सेट होंगे, न केवल Alt कुंजी? मैं समझता हूं कि enum में 1 से अधिक राज्य शामिल हो सकते हैं, लेकिन मुझे यकीन नहीं है कि अगर मैं दबाता हूं तो Alt क्यों होता है? – Setheron

+0

नहीं। मैंने बस विधि की शुरुआत में ब्रेकपॉइंट रखा था और एएलटी कुंजी दबा दी थी। – Setheron

+0

मुझे यह जोड़ना है कि मैं एक तृतीय पक्ष जीयूआई टूलकिट का उपयोग कर रहा हूं, इसलिए संसाधित होने की कुंजी में वे एक मौका जोड़ सकते हैं, लेकिन मुझे उम्मीद है कि वे नहीं हैं। – Setheron

1

मार्क की तकनीक (the accepted answer) संशोधक कुंजी के लिए काम करती है, लेकिन यह मुझे आश्चर्य से पकड़ा कि कुछ चाबियाँ (जैसे तीर) बिट्स के संयोजन हैं, और काम नहीं करेंगे। उदाहरण के लिए निम्न परीक्षण पता चला है सच:

((Keys.Right & Keys.Left) == Keys.Left) 

मैं तीर कुंजी से निपटने के बारे में एक संबंधित StackOverflow पोस्ट पर posted some useful little functions for key handling है।