2012-09-25 8 views

cevap

6

KeyDown olayını kullanamazsınız. TextInput olayını kullanmanız gerekir. Bu, orijinal harfi, altyazı ile (Büyük/Küçük harf) yazdıracaktır.

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

Şimdi, bu ayrıca, basılırsa Shift ve daha fazlasını basacaktır. Bu değiştiricilerin dizinin son maddesini almasını istemiyorsanız, bunu bir char dizisi olarak yapın;) -

+0

garip, TextInput ateş almaz - Ayrıca, kullanıcı böyle Modifiers enum kullanılarak tespit edilebilir Shift tuşunu kullanarak sermaye yazdığınız olmadığını kontrol etmek gerekebilir? – olidev

+0

@olidev Uygun UIElementi ekleyip eklemediğinizi görmek için nesne ağacını kontrol edin. Etkinliği Pencereye bağlamaya başlayın ve ardından aşağı gidin. –

+0

ancak textInput da koddan kovulacak, ben sadece – olidev

4

TextInput/PreviewTextInput'ı (veya olayları dinleyerek) geçersiz kılmalısınız.

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

KeyEventArgs class üst karakter tuşu basılı olup olmadığını belirten "Geçiş" alanı vardır.

Aksi takdirde, CAPS_LOCK düğmesine basıldığında Window_KeyDown yöntemi çağrılacağı için, CAPS_LOCK anahtarının basılıp basılmadığını belirten bir bool değeri kaydedebilirsiniz.

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

anahtar girişinden olay işleyicisi almak istiyorum Uygulama başlatıldığında CapsLock açık ise? Bu her şeyi atmaz mı? –

0

Bunu işlemenin en iyi yolu KeyDown yerine Window_TextInput olayını kullanmaktır.

Ama bu olay uygulamanıza patlamaz dediği gibi Bunun yerine böyle bir kesmek kullanabilirsiniz:

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); 
    } 

} 

Bu düzgün capslock açık olup olmadığını dayanarak karakterleri yazdırır. CapsLock başlangıç ​​değeri, bu bağlantıyı kullanarak alınabilir:

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

Bunun sizin için işe yarar.

5

CAPS lock'un Control.IsKeyLocked yöntemini kullanarak açıp kapatmak isteyip istemediğinizi KeyDown etkinliğinizde kontrol edebilirsiniz.

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(); 
    } 
} 
İlgili konular