Ich möchte herausbekommen, welches UTF-8 Zeichen eine Windows Applikation sieht, wenn eine bestimmte Taste (gegeben durch den Hardware-Scan Code) gedrückt wird, zusätzlich möglicherweise auch noch eine Umschalttaste wie [Shift], [Alt-Gr] usw. Im Prinzip möchte ich alle Scan-Codes einer PC Tastatur in die Routine stopfen können, und danach die Tastenbelegungen verschiedener länderspezifischer Tastaturen im Klartext ausgeben.
Problem: PC Tastaturen schicken nur einen Scan-Code, der je nach Windows Gebietsschema-Einstellung in einen Windows Code (Virtual Key Code) umgewandelt wird.
Die Umwandlung Scancode zu Virtual Key Code habe ich soweit im Griff:
Local $kbdState = DllStructGetPtr(_WinAPI_GetKeyboardState())
; DLLStructSetData($kbdState,1,0x80,$VK_LSHIFT)
DumpDLLArray($kbdState,256,"Keyboard State",1)
_User32_ToUnicodeEx($vkCode, $scanCode, $kbdState , $Result, 5,0, _WinAPI_GetKeyboardLayout(_WinAPI_GetDesktopWindow ( )))
Func _User32_ToUnicodeEx($wVirtKey, $wScanCode, $lpKeyState, ByRef $pwszBuff, $cchBuff, $wFlags, $dwhkl)
Local $vRetVal = DllCall("user32.dll", "int", "ToUnicodeEx", "UINT", $wVirtKey, "UINT", $wScanCode, "ptr", $lpKeyState, "wstr", $pwszBuff, "int", $cchBuff, "UINT", $wFlags, "hwnd", $dwhkl)
$pwszBuff = $vRetVal[4]
Return $vRetVal[0]
EndFunc
Func DumpDLLArray($Array,$LengthOfArray,$NameOfArray,$ElementNumber = 1)
ConsoleWrite("Dump of " & VarGetType($Array) & " " & $NameOfArray & @CRLF)
ConsoleWrite("-------------------------------" & @CRLF)
For $i = 1 to $LengthOfArray
If MOD($i,16) = 1 then
ConsoleWrite(StringFormat("[%4d]",$i))
EndIf
ConsoleWrite(StringFormat("%4s",DllStructGetData($Array,$ElementNumber,$i)))
If MOD($i,16) = 0 then
ConsoleWrite(@CRLF)
EndIf
Next
ConsoleWrite(@CRLF)
endfunc
Alles anzeigen
Im Aufruf von
habe ich der EInfachheit halber im Moment die eigene Tastatur (Layout Deutsch) stehen, aber ich habe auch schon Code der eine andere länderspezifische Tastatur laden kann --> Problem zur Hälfte gelöst.
Nun woillte ich noch verschiedene Modifier (Alt, Shift, Alt-gr) mitgeben um die Zweit- und Drittbelegungen der Tasten zu bekommen, und das will mir nicht gelingen.
Es gelingt mir auch nicht, das $kbdState Array in die Konsole zu schreiben, ich bekomme immer 256 Nullwerte, obwohl ich am zurückgegebenen vkCode sehen kann, dass die Umwandung von z.B. Shift-1 in "!" geklappt hat. Natürlich rührt sich auch nichts, wenn ich versuche, Werte in $kbdState selber zu setzen, also z.B. die linke Shift-Taste per Programm zu drücken (die auskommentierte Zeile). Da aber auch dann die Funktion DumpDLLArray nur Nullen ausgibt habe ich vermutlich zwei Fehler, die ich ums ver***** nicht finden kann: das Setzend es Wertes mit DLLStructSetData schlägt irgendwie fehl, und abgesehen davon stehen in dem kbdState Array sowieso nicht die Statuswerte drinnen die ich lt. Microsoft Doku dort erwartet hätte, oder ich bin zu doof die richtigen Werte in die Konsole zu schreiben. Aktiviere ich z.B. Caps-Lock, müsste mindestens ein Byte <> 0 auftauchen, tut es aber nicht.
Wer kann mir einen Tipp geben wod er Wurm steckt?
Thx, Armin