![]() |
GetAsyncKeyState - Verständnisfrage
Ich beschäftige michz gerade mit dieser Winapi Funktion. Lucky ha ja ein gutes WinAPI Tutorial geschrieben, was mich motiviert hat, mich mal mit selbigem zu beschäftigen.
Nun bin ich beim Lesen der MS Doku zur Routine [B]GetAsyncKeyState()[/] Wenn das MSB gesetzt ist, wurde die abgefragte Taste, die ich als Parameter übergebe, gedrückt. Wenn das LSB Last significant Bit, das niedrigste also 2 hoch Null gesetzt ist, wurde der Schalter beim vorherigen Aufruf der Funktion gedrückt. Ich will aber feststellen, ob der Schalter stattdessen losgelassen wurde. Wie schaffe ich das? HIer der Auszug aud dem MDSN: Zitat:
![]() Aus den Bemerkungen im Abschnitt Remarks werde ich nicht schlau. Wer kann das verständlicher erklären? Welchen Rückgabwert erhalte ich, wenn ich den gedrückten Schalter wieder losgelassen habe? Ich habe verstanden, das das Most Significant Bit, das höchstwertige Bit also, gesetzt ist, wenn die abgefragte Taste gedrückt ist. Ist dann der restliche Wert, wenn das höchstwertige Bit ausmaskiert wird, äquivalent zum Wert der gedrückten Taste? Ist der Rückgabewert immer noch gleich dem Wert der vorher gedrückten, jetzt aber wieder losgelassenen Taste, nur das jetzt das MSB wieder den Wert 0 hat? Wenn nicht, wie erkenne ich dann, was sich gedrückt habe? |
AW: GetAsyncKeyState - Verständnisfrage
Zitat:
MSB = True -> wird jetzt gedrückt MSB = False -> wird jetzt nicht gedrückt LSB = True -> wurde seit dem letzten Aufruf gedrückt (wurde zwischen dem letzten und diesem Aufruf gedrückt) LSB = False -> wurde seit dem letzten Aufruf nicht gedrückt Und jetzt kann man das Beides kombinieren. MSB False und LSB True, dann war es gedrückt und jetzt nicht mehr. PS: MSB = GetAsyncKeyState() < 0 // Wert als Integer LSB = Ord(GetAsyncKeyState()) <> 0 Und "gedrückt" bedeutet nicht "jetzt runterdrücken" sondern "ist (jetzt) gedrückt". |
AW: GetAsyncKeyState - Verständnisfrage
Hallo,
ich bin's nochmal. Habe mir jetzt eine kleine Funktion geschrieben:
Delphi-Quellcode:
Die Funktion "IsUndefinedKey()" habe ich geschrieben weil laut MSDN diese Codes entweder nicht zugewiesen oder reserviert sind. So will ich damit erreichen, das bei Auftreten eines dieser Codes die Funktion GetAsyncKeystate nicht aufgerufen wird.
function IsUndefinedKey(Key: Word): Boolean;
begin case Key of $07, $0A, $0B, $0E, $0F, $16, $1A, $3A, $3B, $3C, $3D, $3E, $3F, $40, $5E, $88, $89, $8A, $8B, $8C, $8D, $8E, $8F, $92, $93, $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D, $9E, $9F: Result := true; else Result := false; end; end; function GetKey: word; var Key: Word; begin for Key := $01 to $FE do begin if not IsUndefinedKey(Key) then if GetAsyncKeyState(Key) < 0 then begin Result := Key; break; end; end; end; Ich habe eine Testschleife:
Delphi-Quellcode:
Wenn ich ESC drücke, wird die Repeat Schleife beendet, wie auch beabsichtigt. Aber die anderen Tasten scheinen nicht anzukommen. Warum?
repeat
Key := GetKey; until Key=27; |
AW: GetAsyncKeyState - Verständnisfrage
Was bedeutet denn diese "scheinen"?
Aber so richtig hast du das MSDN dann doch nicht gelesen, denn sonst würdest du GetKeyboardState verwenden, wenn du sowieso mehrere/viele Tasten abfragen willst. Und warum hörst du nicht auf die Warnungen deines Compilers? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz