GetAsyncKeyState Rückgabewert

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: GetAsyncKeyState Rückgabewert

BeitragDo, März 18, 2010 18:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Ich habe ein Problem mit der Funktion "GetAsyncKeyState" aus der WinAPI.
Die Funktion gibt sehr unterschiedliche Werte aus. Folgende habe ich schon gefunden: http://social.msdn.microsoft.c...a2faaa29f3
Da sind die Werte -32768 und -32767 erläutert. Jetzt kommt bei mir aber auch oft 1, 32767 oder 32768 als Rückgabewert. Was genau bedeuten jetzt diese. Ich kann Regelmäßigkeit beim Auftreten dieser Rückgabewerte feststellen.

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

mpmxyz

BeitragDo, März 18, 2010 18:44
Antworten mit Zitat
Benutzer-Profile anzeigen
1. Short, Rückgabewert von der Funktion: 2 Bytes, signed -> von -32768 bis 32767
Integer, von BlitzBasic benutzt: 4 Bytes, signed -> von -2^31 bis 2^31-1
2. Beim Casten wird nicht auf den Wert bzw. das Vorzeichen geachtet, sondern nur 0-Bits vorne an die Zahl drangehängt:
Short: $FFFF = %1000000000000000 = -32768
Integer: $0000FFFF = %00000000000000001000000000000000 = 32768
Daher sind deine Werte doch richtig. Sie wurden nur falsch umgewandelt.
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

Xaymar

ehemals "Cgamer"

BeitragDo, März 18, 2010 22:34
Antworten mit Zitat
Benutzer-Profile anzeigen
http://msdn.microsoft.com/en-u...85%29.aspx

Hatte mir mal dafür extra eine Funktion geschrieben:
BlitzBasic: [AUSKLAPPEN]
Const VKKEYDOWN = 1
Const VKKEYDOWNLASTCALL = 2
Function GetAsyncKeyState(VK)
Ret = api_GetAsyncKeyState(VK)
If Ret Shr 23 = 1 Then Return VKKEYDOWN
If Ret = 1 Then Return VKKEYDOWNLASTCALL
Return False
End Function


Sollte afaik gehen, wenn ich mich da nicht mit dem shr verzählt hatte

Edit:
Zitat:
Return Value

SHORT

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.


bedeutet:
10000000 00000000 = Gerade gedrückt
00000000 00000001 = nach dem letzten Aufruf gedrückt
Warbseite

Der Eisvogel

BeitragDo, März 18, 2010 22:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber bei mir kommt sehr oft auch das hier: 10000000 00000001
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xaymar

ehemals "Cgamer"

BeitragDo, März 18, 2010 22:54
Antworten mit Zitat
Benutzer-Profile anzeigen
dann ist beides zutreffend.
Warbseite

hazumu-kun

BeitragDo, März 18, 2010 23:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab da ne gute Funktion, die mit den entsprechenden Konstanten, die du bestimmt schon als include parat hast Wink, sehr komfortabel ist:
BlitzBasic: [AUSKLAPPEN]

Function RAW_KeyDown (VirtualKey, IgnoreFocus= False)
If (IgnoreFocus= True) And (api_GetActiveWindow()= 0) Then Return

Return (GetAsyncKeyState( VirtualKey) And %1000000000000000)> 0
End Function


Diese Funktion verhält sich wie das standard Keydown, Rückgabe ist 1 oder 0.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Xaymar

ehemals "Cgamer"

BeitragFr, März 19, 2010 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
In addition zu hamuzu-kuns Beitrag hier nochmal das was KeyHit und KeyDown ersetzen kann
BlitzBasic: [AUSKLAPPEN]
Const MAPVK_VK_TO_VSC		=	0
Const MAPVK_VSC_TO_VK = 1
Const MAPVK_VK_TO_CHAR = 2
Const MAPVK_VSC_TO_VK_EX = 3
Const MAPVK_VK_TO_VSK_EX = 4

Function KeyDown(key)
If api_GetActiveWindow() <> SystemProperty("AppHWND") Then Return False
vk = api_MapVirtualKey(key,MAPVK_VSC_TO_VK)
Return api_GetAsyncKeyState(vk) Shl 16 Shr 31
End Function
Function KeyHit(key) ;KeyDown beeinflusst das hier auch. Lässt sich durch zwischenspeichern der KeyHit variablen ändern, siehe KeyHitEx/FlipEx
If api_GetActiveWindow() <> SystemProperty("AppHWND") Then Return False
vk = api_MapVirtualKey(key,MAPVK_VSC_TO_VK)
Return api_GetAsyncKeyState(vk) Shl 31 Shr 31
End Function

;Fix für "KeyHit"
Global A_KHE[255]
Function FlipEx(VWat=True)
Flip VWat
For ABCDEF = 0 To 255
A_KHE = api_GetAsyncKeyState(vk) Shl 31 Shr 31
Next
End Function
Function KeyHitEx(key)
If api_GetActiveWindow() <> SystemProperty("AppHWND") Then Return False
Ret=A_KHE[key]
A_KHE[key] = False
Return Ret
End Function


Sollte laut allen tests problemlos laufen.
Warbseite

Der Eisvogel

BeitragFr, März 19, 2010 23:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, das ist ne Menge Code. Ich hab es jetzt geschafft, dass alles funktioniert. Danke
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Xaymar

ehemals "Cgamer"

BeitragFr, März 19, 2010 23:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du noch weitere Hilfe bei Tastatur sachen brauchst:
http://msdn.microsoft.com/en-u...85%29.aspx
Ist fast alles da. Das mit dem MapVirtualKey hab ich da auch rausgefunden
Warbseite

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group