Wie kann ich im KeyDown-Ereignis den KeyChar (KeyPress-Ereignis) bestimmen?

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    Wie kann ich im KeyDown-Ereignis den KeyChar (KeyPress-Ereignis) bestimmen?

    Das Problem ist, dass beim Drücken von Nicht-Ascii-Zeichen KeyValue/KeyCode bei KeyDown ein anderes Zeichen liefern, als KeyChar in KeyPress.
    W7, deutsch, deutsche Tastatur (HP)
    Ich benötige im KeyDown-Ereignis den KeyChar vom KeyPress-Ereignis.
    Problem:
    Taste "#" liefert Code 191, Zeichen "¿"
    Taste "End" liefert Code 35, Zeichen "#"
    Wie komme ich im KeyDown-Ereignis bei gedrückter Taste "#" zum Char "'#"?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das Problem ist, dass beim Drücken von Nicht-Ascii-Zeichen KeyValue/KeyCode bei KeyDown ein anderes Zeichen liefern, als KeyChar in KeyPress.

    Du bekommst beim KeyPress Ereignis einen Char zurückgeliefert (ASCII), während Du beim KeyDown Ereignis einen VirtualKey (Keys Enumeration) zurückbekommst. Beides sind unterschiedliche Werte, so gibt es zum Beispiel für die Pfeiltasten nur einen Wert für den VirtualKey, während KeyPress darauf überhaupt nicht darauf reagiert.

    RodFromGermany schrieb:

    Ich benötige im KeyDown-Ereignis den KeyChar vom KeyPress-Ereignis.

    Warum das ? Normalerweise wird man nicht beide Events in ein und demselben Programm benutzen.

    Ich kenne nur 1 Möglichkeit zwischen der Keys-Enumeration und Char hin und her zu konvertieren, und das ist die API MapVirtualKey
    Ich muss im KeyDown-Ereignis den xxx.Text durchmustern und gewisse Zeichen durch Alias-Zeichen ersetzen, z.B. "#". Übrigens scheinen die Zuordnungen sehr vom Tastaturtreiber abzuhängen, denn an einem anderen Rechner geht es richtig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ich muss im KeyDown-Ereignis den xxx.Text durchmustern und gewisse Zeichen durch Alias-Zeichen ersetzen, z.B. "#".

    hmm, verstehe ich nicht ganz: für solche "sichtbaren" Tastenwerte geht doch KeyPress genausogut, KeyDown ist eher für sowas wie Pfeiltasten und Modifier (Shift,Ctrl,Alt). Bei Keydown fragt man dann halt nicht auf Chars sondern auf Keys.X ab.

    Und wenn Du die Werte eines Text-Strings durchmustern und ersetzen musst, so ist die gedrückte Taste eh egal - oder wo ist das der Haken ?
    KeyPress kommt beliebig oft bei gedrückter Taste. :(

    MapVirtuakKey funktioniert, so soll es sein.
    Danke. :P

    Dieser Code läuft:

    Private Declare Function MapVirtualKey Lib "user32.dll" Alias "MapVirtualKeyA" (ByVal uCode As UInt32, ByVal uMapType As UInt32) As UInt32

    Const MAPVK_VK_TO_VSC As UInt32 = &H0
    Const MAPVK_VSC_TO_VK As UInt32 = &H1
    Const MAPVK_VK_TO_CHAR As UInt32 = &H2
    Const MAPVK_VSC_TO_VK_EX As UInt32 = &H3
    Const MAPVK_VK_TO_VSC_EX As UInt32 = &H4

    Private Sub TextBox1_KeyUpDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
    Dim uu As UInt32 = MapVirtualKey(e.KeyCode, MAPVK_VK_TO_CHAR)
    TextBox1.Text = Chr(uu)
    End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!