2017-02-05 3 views
4

Ich arbeite an wpf C# Anwendung und ich erkennen müssen, wenn der Benutzer die Taste „/“ aber ich habe Probleme bei der Suche nach "/ „e.Key, sah ich dort Key.OemBackslash und stopft so ist, aber ich kann nicht richtig Ereignis für finden“/"(Schrägstrich) ...Wie zu erkennen, wann (vorwärts) Slash-Taste in OEM-Tasten gedrückt wird C#

Danke Jungs, Beifall

+0

wie etwa 'e.KeyChar'? –

+0

@ SelmanGenç gibt es keine e.KeyChar in WPF, sollte ich Windows-Formular-Bibliothek enthalten, als es mit meinen MessageBoxes, die in Win-Form existieren auch versäumen –

Antwort

0

Es sollte Key.OemQuestion auf einer US-Tastatur sein. Aber auf einer schwedischen Tastatur ist es D7 so kommt es darauf an. Die Tasten auf der Tastatur erzeugen nicht immer das gleiche Zeichen.

Je nachdem, was Sie versuchen, besser zu tun erhalten Sie die PreviewTextInput Event-Handling:

protected override void OnPreviewTextInput(TextCompositionEventArgs e) 
{ 
    base.OnPreviewTextInput(e); 
    if (e.Text == "/") 
    { 
     Debug.WriteLine("..."); 
    } 
} 
+0

@ Ich arbeite mit WPF und ich verwende dieses Ereignis Window_PreviewKeyDown und sieht aus wie es gibt keine propery Text für e .. –

+0

Nein, es gibt keinen. Deshalb könnten Sie den PreviewTextInput des WPF-Fensters anstelle des PreviewKeyDown-Ereignisses behandeln ... Sonst ist Key.OemQuestion der nächste, den Sie zu einem "/" Schlüssel bekommen. – mm8

+0

übrigens Mate, dann ist gibt es eine Möglichkeit zu erkennen, wenn Enter gedrückt wird, zum Beispiel zuerst nach einem e.Text suchen und danach prüfen, ob Enter gedrückt wird, wie könnte ich es machen, wenn mein Absender nicht KeyEventArgs ist, stattdessen ist es TextCompositionEventArgs .. und TextCompositionEventArgs enthält nicht e.Key == Key.Return .. –

1

Sie können die folgenden Methoden (see this site), um das Zeichen aus dem Schlüssel zu erhalten.

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ 
     bool toUnicodeIsTrue=false; 
     char t = GetCharFromKey(e.Key, ref toUnicodeIsTrue); 
     if (t == '/') 
     { 
      // do stuff 
     } 
     base.OnPreviewKeyDown(e); 
} 


    public static char GetCharFromKey(System.Windows.Input.Key key, ref bool toUnicodeIsTrue) 
    { 
     toUnicodeIsTrue = true; 
     char ch = ' '; 

     // First, you need to get the VirtualKey code. Thankfully, there’s a simple class 
     // called KeyInterop, which exposes a static method VirtualKeyFromKey 
     // that gets us this information 
     int virtualKey = System.Windows.Input.KeyInterop.VirtualKeyFromKey(key); 
     //Then, we need to get the character. This is much trickier. 
     //First we have to get the keyboard state and then we have to map that VirtualKey 
     //we got in the first step to a ScanCode, and finally, convert all of that to Unicode, 
     //because .Net doesn’t really speak ASCII 
     byte[] keyboardState = new byte[256]; 
     GetKeyboardState(keyboardState); 

     uint scanCode = MapVirtualKey((uint)virtualKey, MapType.MAPVK_VK_TO_VSC); 
     StringBuilder stringBuilder = new StringBuilder(2); 

     int result = ToUnicode((uint)virtualKey, scanCode, keyboardState, stringBuilder, stringBuilder.Capacity, 0); 
     switch (result) 
     { 
      case -1: 
       toUnicodeIsTrue = false; 
       break; 
      case 0: 
       toUnicodeIsTrue = false; 
       break; 
      case 1: 
       { 
        ch = stringBuilder[0]; 
        break; 
       } 
      default: 
       { 
        ch = stringBuilder[0]; 
        break; 
       } 
     } 
     return ch; 
    } 

    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern bool GetKeyboardState(byte[] lpKeyState); 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern uint MapVirtualKey(uint uCode, MapType uMapType); 
    public enum MapType : uint 
    { 
     MAPVK_VK_TO_VSC = 0x0, 
     MAPVK_VSC_TO_VK = 0x1, 
     MAPVK_VK_TO_CHAR = 0x2, 
     MAPVK_VSC_TO_VK_EX = 0x3, 
    } 
    [System.Runtime.InteropServices.DllImport("user32.dll")] 
    public static extern int ToUnicode(
     uint wVirtKey, 
     uint wScanCode, 
     byte[] lpKeyState, 
     [System.Runtime.InteropServices.Out, System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.LPWStr, SizeParamIndex = 4)] 
     StringBuilder pwszBuff, 
     int cchBuff, 
     uint wFlags); 
} 

Meine alte Antwort:

protected override void OnPreviewKeyDown(KeyEventArgs e) 
{ //*** 
    if (e.Key == Key.Oem2) 
    { 
     // do stuff 
    } 
    base.OnPreviewKeyDown(e); 
} 

Beachten Sie, dass der Name beginnt mit "OEM" (Original Equipment Manufacturer), die die Tastatur Hersteller bedeutet, ist für seine Funktionalität verantwortlich und variiert in lokalen Tastaturen. Sie können also einen Unterbrechungspunkt in

Zeile meines Codes festlegen und e.Key-Eigenschaft überprüfen.

+0

wird Key.Oem2 nicht ausgelöst wird, wenn ich vorwärts slash :( –

+0

siehe Bearbeiten Sie die Antwort und setzen Sie den Breakpoint – Ron

+0

nichts passiert .. –

Verwandte Themen