Interessantes Thema... hier mal mein Testscript:
AutoIt
;-- TIME_STAMP 2021-02-09 02:42:19 v 0.1
;~ Opt('MustDeclareVars', 1)
#include <WinAPISys.au3>
Global $g_iOutEncoding = Int(StringRegExpReplace(FileRead(@LocalAppDataDir & '\AutoIt v3\SciTE\SciTEUser.properties'), '(?s).+\Routput\.code\.page=(.+?)\R.*', '\1'))
; "§" funktioniert mit der DE-Tastatur, weil es das Zeichen dort gibt.
; "§" funktioniert nicht mit der US-Tastatur, weil es das Zeichen dort nicht gibt.
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
Local $hLayout, $hWnd = WinGetHandle('AutoIt Help'), $dwhkl = _WinAPI_GetKeyboardLayout($hWnd)
_ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(") & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@") & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§") & '] @extended = ' & _ShiftState(@extended) & @CR)
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
_ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§", $dwhkl) & '] @extended = ' & _ShiftState(@extended) & @CR)
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
$hLayout = _WinAPI_LoadKeyboardLayout(0x0409, $KLF_SETFORPROCESS) ; en-US
_ConOut('> vkKeyScan for [' & "(" & '] = [' & _VkKeyScan("(", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('- vkKeyScan for [' & "@" & '] = [' & _VkKeyScan("@", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR & @CR)
_ConOut('+ vkKeyScan for [' & "§" & '] = [' & _VkKeyScan("§", $hLayout) & '] @extended = ' & _ShiftState(@extended) & @CR) ; "§" funktioniert nicht, weil es das Zeichen auf der US-Tastatur nicht gibt.
ConsoleWrite('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ' & @CRLF)
_WinAPI_UnloadKeyboardLayout($hLayout)
Exit
; return value is VK code
; @extended contains shift state
Func _VkKeyScan($s_Char, $hLocale = '')
Local $aRet, $hLayout
_ConOut('! $s_Char = ' & $s_Char & @CRLF)
ConsoleWrite('! AscW($s_Char) = ' & AscW($s_Char) & @CRLF)
_ConOut('! Unicode code for "' & $s_Char & '" = U+' & Hex(AscW($s_Char), 6) & @CRLF)
If IsPtr($hLocale) Then
ConsoleWrite('- $hLocale = ' & $hLocale & @TAB & "The language of the KB is: " & _GetLanguage($hLocale) & " (" & LCIDToLocaleName($hLocale) & ")" & @CRLF)
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScanEx", "ushort", Asc($s_Char), 'dword', $hLocale) ; OK!
$aRet = DllCall("user32.dll", "short", "VkKeyScanEx", "ushort", AscW($s_Char), 'dword', $hLocale) ; OK!
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScanExA", "ushort", Asc($s_Char), 'dword', $hLocale) ; OK!
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScanExW", "ushort", AscW($s_Char), 'dword', $hLocale) ; OK!
Else
$hLayout = _WinAPI_GetKeyboardLayout(WinGetHandle(""))
ConsoleWrite('! $hLayout = ' & $hLayout & @TAB & "The language of the KB is: " & _GetLanguage($hLayout) & " (" & LCIDToLocaleName($hLayout) & ")" & @CRLF)
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScan", "ushort", Asc($s_Char)) ; OK!
$aRet = DllCall("user32.dll", "short", "VkKeyScan", "ushort", AscW($s_Char)) ; OK!
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScanA", "ushort", Asc($s_Char)) ; OK!
;~ $aRet = DllCall("user32.dll", "short", "VkKeyScanW", "ushort", AscW($s_Char)) ; OK!
EndIf
If @error Then Return SetError(@error, @extended, -1)
If $aRet[0] = -1 Then Return SetError(@error, @extended, -2)
Return SetExtended(BitShift($aRet[0], 8), BitAND($aRet[0], 0xFF) & '] = ["' & ChrW(BitAND($aRet[0], 0xFF)) & '"')
EndFunc ;==>_VkKeyScan
Func _ShiftState($extended)
If $extended = -1 Then Return $extended & ' [""]'
Local $sRet
For $i = 0 To 6 Step 1
;~ ConsoleWrite('BitAND('&$extended&', '&2^$i&') = ' & BitAND($extended, 2^$i) & @CRLF)
Switch True
Case $extended = 0
Return '0 [""]'
Case BitAND($extended, 2^$i) = 1
$sRet &= " 1, 'Either SHIFT key is pressed.' "
Case BitAND($extended, 2^$i) = 2
$sRet &= " 2, 'Either CTRL key is pressed.' "
Case BitAND($extended, 2^$i) = 4
$sRet &= " 4, 'Either ALT key is pressed.' "
Case BitAND($extended, 2^$i) = 8
$sRet &= " 8, 'The Hankaku key is pressed' "
Case BitAND($extended, 2^$i) = 16
$sRet &= " 16, 'Reserved (defined by the keyboard layout driver).' "
Case BitAND($extended, 2^$i) = 32
$sRet &= " 32, 'Reserved (defined by the keyboard layout driver).' "
EndSwitch
Next
If $sRet = '' Then Exit $extended
Return $extended & ' [' & $sRet & ']' & ($extended = 6 ? ' (AltGr)' : '')
EndFunc ;==>_ShiftState
; Retrieve the language of the operating system.
Func _GetLanguage($hLayout = '')
; @OSLang is four characters in length, the first two is the dialect and the remaining two are the language group.
; Therefore we only require the language group and therefore select the two right-most characters.
If $hLayout = '' Then $hLayout = @KBLayout
;~ Switch StringRight(@OSLang, 2)
Switch StringRight($hLayout, 2)
Case "07"
Return "German"
Case "09"
Return "English"
Case "0a"
Return "Spanish"
Case "0b"
Return "Finnish"
Case "0c"
Return "French"
Case "10"
Return "Italian"
Case "13"
Return "Dutch"
Case "14"
Return "Norwegian"
Case "15"
Return "Polish"
Case "16"
Return "Portuguese"
Case "1d"
Return "Swedish"
Case Else
Return "Other (can't determine with @OSLang directly)"
EndSwitch
EndFunc ;==>_GetLanguage
Func LCIDToLocaleName($iLCID)
If IsPtr($iLCID) Then
$iLCID = '0x0000' & StringRight($iLCID, 4)
ElseIf $iLCID = '' Then
$iLCID = '0x' & @KBLayout
EndIf
Local $aRet = DllCall("kernel32.dll", "int", "LCIDToLocaleName", "int", $iLCID, "wstr", "", "int", 85, "dword", 0)
Return $aRet[2]
EndFunc ;==>LCIDToLocaleName
; Damit die Umlaute und Sonderzeichen "in der Console und in SciTE" korrekt dargestellt werden.
Func _ConOut($vText)
; String(), Damit _WinAPI_WideCharToMultiByte nicht abstürzt, wenn kein String übergeben wurde!
ConsoleWrite(_WinAPI_WideCharToMultiByte(String($vText), @Compiled ? 1 : $g_iOutEncoding, True, False))
EndFunc ;==>_ConOut
Alles anzeigen