Seite 1 von 1

GetAsyncKeyState_(#VK_CONTROL)

Verfasst: 12.11.2013 07:34
von Ara
Getestet mit

Code: Alles auswählen

Debug GetAsyncKeyState_(#VK_CONTROL)
Debug GetAsyncKeyState_(#VK_CONTROL)
In der 64 Bit Version bekomme ich als Ergebnis

Code: Alles auswählen

-6047107317760
0
In der 32 Bit Version ist alles OK und es kommt Viele Grüße
Thomas

__________________________________________________
Thread verschoben
Bugs>Windows
07.12.2013
RSBasic

Re: GetAsyncKeyState_(#VK_CONTROL)

Verfasst: 12.11.2013 08:45
von Danilo
GetAsyncKeyState_() gibt ein WORD zurück, also nur 16 Bits. In diesem WORD werden nur 2 Bits benutzt - das Kleinste und das Größte.
Das kleinste Bit gibt dabei an, ob die Taste seit dem letzten Aufruf von GetAsyncKeyState_() gedrückt wurde. In einem Multitaskingsystem
kann man dieses Bit aber nicht zuverlässig auswerten, da inzwischen ein anderer Task GetAsyncKeyState_() aufgerufen haben könnte.
Microsoft weist in der Hilfe zu GetAsyncKeyState_() extra darauf hin, dass das ein Überbleibsel von 16-bit Windows ist, und wegen
der Kompatibilität noch da ist, man sich aber nicht auf diesen Wert verlassen kann.
Bit 16 gibt an, ob die Taste momentan gedrückt ist, und nur dieses Bit kann man zuverlässig auswerten. Die anderen Bits sind
nicht definiert, und können 0 oder 1 sein.

Der korrekte Aufruf muss also ein Test auf Bit 16 sein:

Code: Alles auswählen

Debug GetAsyncKeyState_(#VK_CONTROL) & (1<<15)
Debug GetAsyncKeyState_(#VK_CONTROL) & 32768
Debug Bool(GetAsyncKeyState_(#VK_CONTROL) & 32768)

Re: GetAsyncKeyState_(#VK_CONTROL)

Verfasst: 12.11.2013 17:34
von Ara
Vielen Dank, so geht es.

Re: GetAsyncKeyState_(#VK_CONTROL)

Verfasst: 07.12.2013 16:57
von Chimorin
Vielen Dank für die ausführliche Antwort!

Re: GetAsyncKeyState_(#VK_CONTROL)

Verfasst: 29.12.2013 00:27
von Regenduft
Architektur- (x86/x64) und datentypunabhängig (falls man den Rückgabewert in einer Variable puffert) geht's meiner Meinung nach so:

Code: Alles auswählen

GetAsyncKeyState_(#VK_CONTROL) & ~1
Da ich schon voll drauf reingefallen bin: Der alte "Initialisierungstrick" funktioniert seit Win 7 nicht mehr zuverlässig kann absolut unberechenbar zu einer Endlosschleife führen (auch wenn keine Taste betätigt wird/wurde):

Code: Alles auswählen

; Funktioniert NICHT mehr zuverlässig seit Win 7 und
; kann unberechenbar zu einer Endlosschleife führen.

Procedure InitAsyncKeyState()
  Define i
  Repeat
    Define x = 0
    For i = 0 To $FF
      x | GetAsyncKeyState_(i)
    Next
  Until x = 0
EndProcedure

InitAsyncKeyState()