AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

GetAsyncKeyState - Verständnisfrage

Ein Thema von FragenderHerbert · begonnen am 24. Okt 2014 · letzter Beitrag vom 31. Okt 2014
Antwort Antwort
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#1

GetAsyncKeyState - Verständnisfrage

  Alt 24. Okt 2014, 20:00
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 von MSDN:
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.
von hier:
http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

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?

Geändert von FragenderHerbert (24. Okt 2014 um 20:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.774 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: GetAsyncKeyState - Verständnisfrage

  Alt 24. Okt 2014, 20:34
Zitat:
wurde der Schalter beim vorherigen Aufruf der Funktion gedrückt
Falsch. Es heißt "seit".

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".
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list
  Mit Zitat antworten Zitat
FragenderHerbert

Registriert seit: 4. Dez 2013
47 Beiträge
 
#3

AW: GetAsyncKeyState - Verständnisfrage

  Alt 31. Okt 2014, 00:16
Hallo,

ich bin's nochmal. Habe mir jetzt eine kleine Funktion geschrieben:

Delphi-Quellcode:
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;
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.

Ich habe eine Testschleife:

Delphi-Quellcode:
repeat
  Key := GetKey;
until Key=27;
Wenn ich ESC drücke, wird die Repeat Schleife beendet, wie auch beabsichtigt. Aber die anderen Tasten scheinen nicht anzukommen. Warum?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
40.774 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: GetAsyncKeyState - Verständnisfrage

  Alt 31. Okt 2014, 02:17
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?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list

Geändert von himitsu (31. Okt 2014 um 02:36 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf