Seite 1 von 1

Virtual Scan Code in ASCII

Verfasst: 03.09.2005 15:23
von MASH
Ich bekomme es einfach nicht hin einen virtual Scan code in ein ASCII Symbol zu konvertieren mit der Funktion "ToAscii". Kann mir da jemand helfen

Re: Virtual Scan Code in ASCII

Verfasst: 09.05.2011 22:08
von Regenduft
[Edit]
Wer lesen kann ist klar im Vorteil. :oops:
MSDN (ToAscii) hat geschrieben:Translates the specified virtual-key code and keyboard state to the corresponding character or characters.
(...)
Typically, ToAscii performs the translation based on the virtual-key code. In some cases, however, bit 15 of the uScanCode parameter may be used to distinguish between a key press and a key release. The scan code is used for translating ALT+ number key combinations.
[/Edit]

Ich hatte auch mit "ToAscii" Probleme, darum habe ich das ganze (etwas umständlich aber effektiv) mit "MapVirtualKeyEx" gelöst.
Erst wandel ich von Scancode zu Virtualkey und anschließend von Virtualkey zu Character.

Code: Alles auswählen

; PB 4.60 beta 3 / Regenduft

CompilerIf Defined(MAPVK_VSC_TO_VK,#PB_Constant)=0
  #MAPVK_VSC_TO_VK=1
CompilerEndIf

CompilerIf Defined(MAPVK_VK_TO_CHAR,#PB_Constant)=0
  #MAPVK_VK_TO_CHAR=2
CompilerEndIf

Layout = GetKeyboardLayout_(0)

VirtualScanCode = 45 ; = X-Taste

Debug Chr(MapVirtualKeyEx_(MapVirtualKeyEx_(VirtualScanCode,#MAPVK_VSC_TO_VK,Layout),#MAPVK_VK_TO_CHAR,Layout))
Falls Du's brauchen kannst, hier ist meine Prozedursammlung für kreuz und quer Wandlungen zwischen Virtualkeys (Vk), Scancodes(Vsc), Characters (Chr), Ascii-Werten (Asc) und Tastenbeschriftung (Str).

Prozeduren, welche auf "Ex" enden unterscheiden zwischen linker und rechter Taste bei Virtualkeys, bzw. #KEYEVENTF_EXTENDEDKEY und "normal" bei Scancodes.

Code: Alles auswählen

; PB 4.60 beta 3 / Regenduft

EnableExplicit

CompilerIf Defined(MAPVK_VK_TO_VSC   ,#PB_Constant)=0 : #MAPVK_VK_TO_VSC   =0 : CompilerEndIf
CompilerIf Defined(MAPVK_VSC_TO_VK   ,#PB_Constant)=0 : #MAPVK_VSC_TO_VK   =1 : CompilerEndIf
CompilerIf Defined(MAPVK_VK_TO_CHAR  ,#PB_Constant)=0 : #MAPVK_VK_TO_CHAR  =2 : CompilerEndIf
CompilerIf Defined(MAPVK_VSC_TO_VK_EX,#PB_Constant)=0 : #MAPVK_VSC_TO_VK_EX=3 : CompilerEndIf
CompilerIf Defined(MAPVK_VK_TO_VSC_EX,#PB_Constant)=0 : #MAPVK_VK_TO_VSC_EX=4 : CompilerEndIf ; erst ab Vista unterstützt!

Procedure.i VkToAsc(VirtualKey)
  ProcedureReturn MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_CHAR,GetKeyboardLayout_(0))
EndProcedure

Procedure.s VkToChr(VirtualKey)
  ProcedureReturn Chr(MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_CHAR,GetKeyboardLayout_(0)))
EndProcedure

Procedure.s VkToStr(VirtualKey)
  Protected Ergebnis${127}
  GetKeyNameText_(MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_VSC,GetKeyboardLayout_(0))<<16,@Ergebnis$,128)
  ProcedureReturn Ergebnis$
EndProcedure

Procedure.s VkToStrEx(VirtualKey) ; erst ab Vista unterstützt!
  Protected Ergebnis${127}
  GetKeyNameText_(MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_VSC_EX,GetKeyboardLayout_(0))<<16,@Ergebnis$,128) ; erst ab Vista unterstützt!
  ProcedureReturn Ergebnis$
EndProcedure

Procedure.i VkToVsc(VirtualKey)
  ProcedureReturn MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_VSC,GetKeyboardLayout_(0))
EndProcedure

Procedure.i VkToVscEx(VirtualKey) ; erst ab Vista unterstützt!
  ProcedureReturn MapVirtualKeyEx_(VirtualKey,#MAPVK_VK_TO_VSC_EX,GetKeyboardLayout_(0)) ; erst ab Vista unterstützt!
EndProcedure

Procedure.i VscToAsc(VirtualScanCode)
  Protected Layout = GetKeyboardLayout_(0)
  ProcedureReturn MapVirtualKeyEx_(MapVirtualKeyEx_(VirtualScanCode,#MAPVK_VSC_TO_VK,Layout),#MAPVK_VK_TO_CHAR,Layout)
EndProcedure

Procedure.s VscToChr(VirtualScanCode)
  Protected Layout = GetKeyboardLayout_(0)
  ProcedureReturn Chr(MapVirtualKeyEx_(MapVirtualKeyEx_(VirtualScanCode,#MAPVK_VSC_TO_VK,Layout),#MAPVK_VK_TO_CHAR,Layout))
EndProcedure

Procedure.s VscToStr(VirtualScanCode)
  Protected Ergebnis${127}
  GetKeyNameText_(VirtualScanCode<<16,@Ergebnis$,128)
  ProcedureReturn Ergebnis$
EndProcedure

Procedure.i VscToVk(VirtualScanCode)
  ProcedureReturn MapVirtualKeyEx_(VirtualScanCode,#MAPVK_VSC_TO_VK,GetKeyboardLayout_(0))
EndProcedure

Procedure.i VscToVkEx(VirtualScanCode)
  ProcedureReturn MapVirtualKeyEx_(VirtualScanCode,#MAPVK_VSC_TO_VK_EX,GetKeyboardLayout_(0))
EndProcedure
Nebenbei: Wäre der Thread nicht in "Betriebssystemspezifisch > Windows" besser aufgehoben?