GetAsyncKeyState_(#VK_CONTROL)

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

GetAsyncKeyState_(#VK_CONTROL)

Beitrag 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
Win11 Pro
PureBasic 6.10 LTS
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: GetAsyncKeyState_(#VK_CONTROL)

Beitrag 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)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Ara
Beiträge: 35
Registriert: 29.08.2004 13:40

Re: GetAsyncKeyState_(#VK_CONTROL)

Beitrag von Ara »

Vielen Dank, so geht es.
Win11 Pro
PureBasic 6.10 LTS
Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: GetAsyncKeyState_(#VK_CONTROL)

Beitrag von Chimorin »

Vielen Dank für die ausführliche Antwort!
Bild

- formerly known as Bananenfreak -
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: GetAsyncKeyState_(#VK_CONTROL)

Beitrag 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()
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten