Benutzer mit den meisten Antworten
Tasten: oe, at, ae, ue

Frage
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
-
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
-
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
-
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
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
-
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
-
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 -
Hallo Yves,
Ok das habe ich jetzt nicht ganz verstanden wo muss ich das einfügen, damit ich jede Tasteneingabe als String habe?
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
LG Yves Riedener -
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 -
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
-
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 -
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
-
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