none
Tasten: oe, at, ae, ue RRS feed

Antworten

  • Hallo Yves,

    wenn Du das zum aktuellen Keyboardlayout passende Zeichen erhalten möchtest, kannst Du die ToUnicode API Funktion verwenden. Ergänzendes Beispiel zu Deinem Code in genannten Link:

      <DllImport("user32.dll")> _
      Private Shared Function ToUnicode(ByVal wVirtKey As UInteger, _
                                        ByVal wScanCode As UInteger, _
                                        ByVal lpKeyState() As Byte, _
                                        <Out(), MarshalAs(UnmanagedType.LPWStr, SizeConst:=64)> _
                                        ByVal pwszBuff As System.Text.StringBuilder, _
                                        ByVal cchBuff As Integer, _
                                        ByVal wFlags As UInteger) As Integer
      End Function
    
      <DllImport("user32.dll")> _
      Private Shared Function GetKeyboardState(ByVal keyState() As Byte) As Boolean
      End Function
      
      Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
    
        If nCode = HC_ACTION And wParam = New IntPtr(WM_KEYUP) Then
          Dim lKeyState(255) As Byte
          Dim lSB As System.Text.StringBuilder
    
          GetKeyboardState(lKeyState)
    
          lSB = New System.Text.StringBuilder(64)
    
          If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
            Debug.Print(lSB.ToString)
          End If
    	End If
    	
    	Return CallNextHookEx(mHandle, nCode, wParam, lParam)
    End Function
    	 


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort vorgeschlagen Elmar Boye Dienstag, 16. März 2010 08:00
    • Als Antwort markiert Yves Riedener Dienstag, 16. März 2010 10:02
    Montag, 15. März 2010 20:20
  • Hallo Yves,

    ich kann nicht so recht nachvollziehen, was genau Dir bei der Umsetzung Probleme bereitet. In Deinem Beitrag siehst Du bereits eine Fallunterscheidung vor und ergänzt Deine Zeichenfolge mit den entsprechenden Ziffern. Statt der Ziffern fragst Du jetzt auf Keys.Enter oder Keys.Tab ab und fügst entsprechende Ersatzzeichenfolgen ein. ControlChars.CrLf bei Keys.Enter, "[t]" bei Keys.Tab. Keys. In etwa:

     Private Function KeyboardHookProc(ByVal nCode As Integer, _
                      ByVal wParam As IntPtr, _
                      ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
    
      If nCode = HC_ACTION And wParam = New IntPtr(WM_KEYUP) Then
    
       Select Case lParam.vkCode
        Case Keys.Enter
         abc &= ControlChars.CrLf
    
        Case Keys.Tab
         abc &= "[t]"
    
        Case Keys.Back
         abc = abc.Substring(0, abc.Length - 1)
    
        Case Else
         Dim lKeyState(255) As Byte
         Dim lSB As System.Text.StringBuilder
    
         GetKeyboardState(lKeyState)
    
         lSB = New System.Text.StringBuilder(64)
    
         If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
          abc &= lSB.ToString
         End If
    
       End Select
    
      End If
    
      Return CallNextHookEx(mHandle, nCode, wParam, lParam)
    
     End Function


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Yves Riedener Mittwoch, 26. Mai 2010 04:41
    Samstag, 22. Mai 2010 18:32
  • Hallo Yves,

    die komplette Liste der KeyCodes findest Du (neben dem Objekt Katalog) hier:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.keys.aspx

    ü = Oem1
    ö = Oemtilde
    ä = Oem7

    @ ist eine Tastenkombination aus AltGr und Q.
    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    • Als Antwort markiert Yves Riedener Dienstag, 16. März 2010 10:02
    Montag, 15. März 2010 19:56
  • Indem Du statt der Ausgabe in der Debug Konsole, Deine Klassenvariable 'abc' um die eingegebenen Zeichen erweiterst, so wie Du es bereits mit Deinen fest vorgegebenen Zahlen vorgemacht hast:

     If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
      abc &= lSB.ToString
     End If


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Yves Riedener Dienstag, 18. Mai 2010 15:46
    Montag, 17. Mai 2010 18:56

Alle Antworten

  • Hallo Yves,

    die komplette Liste der KeyCodes findest Du (neben dem Objekt Katalog) hier:
    http://msdn.microsoft.com/de-de/library/system.windows.forms.keys.aspx

    ü = Oem1
    ö = Oemtilde
    ä = Oem7

    @ ist eine Tastenkombination aus AltGr und Q.
    Olaf Helper ----------- * cogito ergo sum * errare humanum est * quote erat demonstrandum * Wenn ich denke, ist das ein Fehler und das beweise ich täglich http://olafhelper.over-blog.de
    • Als Antwort markiert Yves Riedener Dienstag, 16. März 2010 10:02
    Montag, 15. März 2010 19:56
  • Hallo Yves,

    wenn Du das zum aktuellen Keyboardlayout passende Zeichen erhalten möchtest, kannst Du die ToUnicode API Funktion verwenden. Ergänzendes Beispiel zu Deinem Code in genannten Link:

      <DllImport("user32.dll")> _
      Private Shared Function ToUnicode(ByVal wVirtKey As UInteger, _
                                        ByVal wScanCode As UInteger, _
                                        ByVal lpKeyState() As Byte, _
                                        <Out(), MarshalAs(UnmanagedType.LPWStr, SizeConst:=64)> _
                                        ByVal pwszBuff As System.Text.StringBuilder, _
                                        ByVal cchBuff As Integer, _
                                        ByVal wFlags As UInteger) As Integer
      End Function
    
      <DllImport("user32.dll")> _
      Private Shared Function GetKeyboardState(ByVal keyState() As Byte) As Boolean
      End Function
      
      Private Function KeyboardHookProc(ByVal nCode As Integer, ByVal wParam As IntPtr, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
    
        If nCode = HC_ACTION And wParam = New IntPtr(WM_KEYUP) Then
          Dim lKeyState(255) As Byte
          Dim lSB As System.Text.StringBuilder
    
          GetKeyboardState(lKeyState)
    
          lSB = New System.Text.StringBuilder(64)
    
          If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
            Debug.Print(lSB.ToString)
          End If
    	End If
    	
    	Return CallNextHookEx(mHandle, nCode, wParam, lParam)
    End Function
    	 


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort vorgeschlagen Elmar Boye Dienstag, 16. März 2010 08:00
    • Als Antwort markiert Yves Riedener Dienstag, 16. März 2010 10:02
    Montag, 15. März 2010 20:20
  • Danke, aber es treten noch folgende Fehlermeldungen auf:
    Fehler    1    Der Typ "KBDLLHOOKSTRUCT" ist nicht definiert.
    Fehler    2    Der Name "HC_ACTION" wurde nicht deklariert.
    Fehler    3    Der Name "WM_KEYUP" wurde nicht deklariert.
    Fehler    4    Der Name "CallNextHookEx" wurde nicht deklariert.
    Fehler    5    Der Name "mHandle" wurde nicht deklariert.

    Muss ich noch irgendwo etwas ergänzen?
    LG Yves Riedener
    Dienstag, 16. März 2010 10:08
  • Hallo Yves,

    wenn Du das zum aktuellen Keyboardlayout passende Zeichen erhalten möchtest, kannst Du die ToUnicode API Funktion verwenden. Ergänzendes Beispiel zu Deinem Code in genannten Link:

     <DllImport("user32.dll"
    )> _
    Private Shared Function ToUnicode(ByVal wVirtKey As UInteger , _
    ByVal wScanCode As UInteger , _
    ByVal lpKeyState() As Byte , _
    <Out(), MarshalAs(UnmanagedType.LPWStr, SizeConst:=64)> _
    ByVal pwszBuff As System.Text.StringBuilder, _
    ByVal cchBuff As Integer , _
    ByVal wFlags As UInteger ) As Integer
    End Function

    <DllImport("user32.dll" )> _
    Private Shared Function GetKeyboardState(ByVal keyState() As Byte ) As Boolean
    End Function

    Private Function KeyboardHookProc(ByVal nCode As Integer , ByVal wParam As IntPtr, ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr

    If nCode = HC_ACTION And wParam = New IntPtr(WM_KEYUP) Then
    Dim lKeyState(255) As Byte
    Dim lSB As System.Text.StringBuilder

    GetKeyboardState(lKeyState)

    lSB = New System.Text.StringBuilder(64)

    If CBool (ToUnicode(CType (lParam.vkCode, UInteger ), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
    Debug.Print(lSB.ToString)
    End If
    End If

    Return CallNextHookEx(mHandle, nCode, wParam, lParam)
    End Function



    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Ok das habe ich jetzt nicht ganz verstanden wo muss ich das einfügen, damit ich jede Tasteneingabe als String habe?

    LG Yves Riedener
    Sonntag, 16. Mai 2010 15:17
  • Hallo Yves,

    das Beispiel Bezog sich auf Deinen Beitrag zum Thema systemweiter Tastatur-Hook den Du selber als Referenz angegeben hast. Dort musst Du Deine KeyboardHookProc Methode entsprechend erweitern bzw. ersetzt diese durch die in meinem Beitrag oben gezeigte Variante.


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Sonntag, 16. Mai 2010 16:49
  • Gut, danke es funktioniert, aber wie kann ich die Aufzeichnung durch button 3 abfragen?
    LG Yves Riedener
    Montag, 17. Mai 2010 16:05
  • Indem Du statt der Ausgabe in der Debug Konsole, Deine Klassenvariable 'abc' um die eingegebenen Zeichen erweiterst, so wie Du es bereits mit Deinen fest vorgegebenen Zahlen vorgemacht hast:

     If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
      abc &= lSB.ToString
     End If


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Yves Riedener Dienstag, 18. Mai 2010 15:46
    Montag, 17. Mai 2010 18:56
  • Danke, aber gibt es eine Möglichkeit um bei ENTER /Mausklick ein bestimmtes zeichen einzufügen?
    LG Yves Riedener
    Dienstag, 18. Mai 2010 15:47
  • Wo möchtest Du es denn einfügen?
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Dienstag, 18. Mai 2010 18:23
  • in abc
    LG Yves Riedener
    Mittwoch, 19. Mai 2010 14:45
  • Ich möchte, dass wenn man die Rück Taste drückt, das letzte Zeichen gelöscht wird, wenn man die Enter Taste drückt, ein Absatzt gemacht wird und wenn man die maustaste drückt die Zeichen [m] erscheinen. Wenn man Tab drückt soll [t] erscheinen. Also mit erscheinen meine ich in die Dim abc As String Variable gefügt werden.
    LG Yves Riedener
    Samstag, 22. Mai 2010 16:19
  • Hallo Yves,

    ich kann nicht so recht nachvollziehen, was genau Dir bei der Umsetzung Probleme bereitet. In Deinem Beitrag siehst Du bereits eine Fallunterscheidung vor und ergänzt Deine Zeichenfolge mit den entsprechenden Ziffern. Statt der Ziffern fragst Du jetzt auf Keys.Enter oder Keys.Tab ab und fügst entsprechende Ersatzzeichenfolgen ein. ControlChars.CrLf bei Keys.Enter, "[t]" bei Keys.Tab. Keys. In etwa:

     Private Function KeyboardHookProc(ByVal nCode As Integer, _
                      ByVal wParam As IntPtr, _
                      ByRef lParam As KBDLLHOOKSTRUCT) As IntPtr
    
      If nCode = HC_ACTION And wParam = New IntPtr(WM_KEYUP) Then
    
       Select Case lParam.vkCode
        Case Keys.Enter
         abc &= ControlChars.CrLf
    
        Case Keys.Tab
         abc &= "[t]"
    
        Case Keys.Back
         abc = abc.Substring(0, abc.Length - 1)
    
        Case Else
         Dim lKeyState(255) As Byte
         Dim lSB As System.Text.StringBuilder
    
         GetKeyboardState(lKeyState)
    
         lSB = New System.Text.StringBuilder(64)
    
         If CBool(ToUnicode(CType(lParam.vkCode, UInteger), lParam.scanCode, lKeyState, lSB, 64, 0)) Then
          abc &= lSB.ToString
         End If
    
       End Select
    
      End If
    
      Return CallNextHookEx(mHandle, nCode, wParam, lParam)
    
     End Function


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert Yves Riedener Mittwoch, 26. Mai 2010 04:41
    Samstag, 22. Mai 2010 18:32
  • Ist das mit dem Mausklick nicht realisierbar?

    Danke das andere ist gut


    LG Yves Riedener
    Montag, 24. Mai 2010 06:37
  • Rate mal, warum das Teil "Keyboard Hook" heißt? Für die Maus brauchst Du einen Mouse Hook.

    Low-Level Mouse Hook in C#
    http://blogs.msdn.com/toub/archive/2006/05/03/589468.aspx


    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Montag, 24. Mai 2010 08:11