2012-09-25 13 views
5

WPF मैं कुंजी कुंजीपटल पर दबाया के साथ या बिना caplock प्राप्त करना चाहते हैं के साथ लोअरकेस मिलती है:keydown

private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) 
{ 
    e.Key.ToString(); 
} 

जब मैं कीबोर्ड पर "एक" या 'ए' टाइप करें, ई का परिणाम है। कुंजी हमेशा "ए" है। 'ए' दर्ज करने के लिए मैं 'ए' कैसे प्राप्त कर सकता हूं?

अग्रिम धन्यवाद।

उत्तर

6

आप KeyDown ईवेंट का उपयोग नहीं कर सकते। आपको TextInput ईवेंट का उपयोग करने की आवश्यकता होगी। यह मूल पत्र को इसके कैप्शन (अपरकेस/लोअरकेस) के साथ प्रिंट करेगा।

private void Window_TextInput(object sender, TextCompositionEventArgs e) 
    { 
     Console.WriteLine(e.Text); 
    } 

अब, यह Shift को भी मुद्रित करेगा और यदि इसे दबाया जाए तो भी। यदि आप नहीं चाहते हैं कि उन संशोधकों को केवल स्ट्रिंग का अंतिम आइटम प्राप्त करें- इसे चार सरणी के रूप में बनाएं;) -

+0

अजीब, TextInput निकाल दिया नहीं करता है - इसके अलावा, आप अगर उपयोगकर्ता राजधानी में टाइप Shift कुंजी जो Modifiers enum इस तरह का उपयोग कर पहचाना जा सकता है का उपयोग कर जांच करने के लिए आवश्यकता हो सकती है? – olidev

+0

@olidev ऑब्जेक्ट ट्री को यह देखने के लिए जांचें कि क्या आप इसे उचित UIElement संलग्न कर रहे हैं या नहीं। घटना को विंडो में संलग्न करना प्रारंभ करें और फिर नीचे जाएं। –

+0

लेकिन टेक्स्ट इनपुट को कोड से भी निकाल दिया जाएगा, मैं केवल मुख्य इनपुट – olidev

4

टेक्स्ट इनपुट/पूर्वावलोकन टेक्स्टक्स्ट इनपुट (या घटनाओं को सुनना) को ओवरराइड करना चाहिए।

protected override void OnPreviewTextInput(TextCompositionEventArgs e) 
{ 
    base.OnPreviewTextInput(e); 
    Console.WriteLine(e.Text); 
} 
2

KeyEventArgs class "Shift" क्षेत्र है जो यह बताते हैं कि SHIFT कुंजी दबाया गया था।

अन्यथा, क्योंकि CAPS_LOCK दबाए जाने पर Window_KeyDown विधि को कॉल किया जाएगा, तो आप बूल मान सहेज सकते हैं यह दर्शाता है कि CAPS_LOCK कुंजी दबाया गया था या नहीं।

bool isCapsLockPressed; 
    private void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { 
      if(e.KeyCode == Keys.CapsLock) { 
       isCapsLockPressed = !isCapsLockPressed; 
      } 
    } 
+1

से इवेंट हैंडलर प्राप्त करना चाहता हूं यदि ऐप शुरू होने पर कैप्स लॉक चालू है तो क्या होगा? क्या वह सब कुछ फेंक नहीं देगा? –

0

इसे संभालने का सबसे अच्छा तरीका KeyDown की बजाय Window_TextInput ईवेंट का उपयोग करना है।

लेकिन जैसा कि आप ने कहा कि इस घटना को आपके आवेदन पर आग नहीं है कि आप के बजाय इस तरह एक हैक का उपयोग कर सकते हैं:

bool iscapsLock = false; 
bool isShift = false; 
private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.CapsLock) 
     iscapsLock = !iscapsLock; 

    if (e.Key >= Key.A && e.Key <= Key.Z) 
    { 
     bool shift = isShift; 
     if (iscapsLock) 
      shift = !shift; 
     int s = e.Key.ToString()[0]; 
     if (!shift) 
     { 
      s += 32; 
     } 
     Debug.Write((char)s); 
    } 

} 

यह ठीक से capslock चालू नहीं या है या नहीं के आधार पर पात्रों प्रिंट होगा। Capslock का प्रारंभिक मूल्य इस लिंक का उपयोग पुनः प्राप्त किया जा सकता है:

http://cboard.cprogramming.com/csharp-programming/105103-how-detect-capslock-csharp.html

मुझे आशा है कि यह आपके लिए काम करता है।

5

आप KeyDown ईवेंट में देख सकते हैं कि CAPS lockControl.IsKeyLocked विधि का उपयोग कर चालू या बंद है।

private void Window_KeyDown(object sender, KeyEventArgs e) 
{ 
    string key = e.Key.ToString(); 
    bool isCapsLockOn = System.Windows.Forms.Control 
         .IsKeyLocked(System.Windows.Forms.Keys.CapsLock); 
    bool isShiftKeyPressed = (Keyboard.Modifiers & ModifierKeys.Shift) 
           == ModifierKeys.Shift; 
    if (!isCapsLockOn && !isShiftKeyPressed) 
    { 
     key = key.ToLower(); 
    } 
} 
संबंधित मुद्दे