![]() |
Key abfrage
In Basic frage ich den Status von einem Key so ab
Delphi-Quellcode:
Wie kann ich das für nonvcl in Delphi abfragen ?
'// Prüfe den Key oder Mouse Button status.
FUNCTION IsKeyDown (BYVAL CheckKey AS LONG) AS LONG LOCAL KeyDown AS LONG KeyDown = GetAsyncKeyState(CheckKey) FUNCTION = BIT(KeyDown, 15) END FUNCTION Hab hier beim suchen nicht das passende gefunden gruss Emil |
Re: Key abfrage
|
Re: Key abfrage
Hallo Emil,
so?
Delphi-Quellcode:
33 = Bild auf
if (GetAsyncKeyState(33) and 15) = 1 then ShowMessage('ist gedrückt') else ShowMessage('ist nicht gedrückt');
34 = Bild ab GetAsyncKeyState ist in Windows.pas definiert. |
Re: Key abfrage
Zitat:
Ansonsten ist das richtig was du sagst ;) gruss Emil |
Re: Key abfrage
Zitat:
Danke für eure Hilfe. Wenns mal fertig stell ich den Source Online EDIT: Also das richtige resultat bekomme ich nicht
Delphi-Quellcode:
wird immer 0 zurückgegeben .. hmm
function IsKeyDown(CheckKey: Integer): SmallInt;
begin result := (GetAsyncKeyState(CheckKey) and 15); end; function IsLButtonDown: Integer; begin Result := IsKeyDown(1); end; // Überprüfe SHIFT key status function zIsShiftKeyPressed: Integer; begin Result := IsKeyDown(16); end; // Überprüfe CTRL key status. function zIsCtrlKeyPressed: Integer; begin Result := IsKeyDown(17); end; // Überprüfe rechten Mouse button status function IsRButtonDown: Integer; begin Result := IsKeyDown(2); end; gruss Emil |
Re: Key abfrage
Zitat:
|
Re: Key abfrage
Hallo,
hab's bei mir ausprobiert, so funktioniert es, es ist ja kein 33 and 15 sondern ein Ergebnis der Funktion and 15, was immer die Funktion warum auch ausgeben mag. |
Re: Key abfrage
Zitat:
Zur Klärung einfach mal die ![]() MSDN: GetAsyncKeyState() 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. Mit anderen Worten: Teste Bit 15 wenn du den aktuellen Tastenstatus haben willst, teste Bit 0, wenn du wissen willst, ob die Taste seit dem letzten Aufruf gedrückt wurde. Aktueller Status:
Delphi-Quellcode:
Status seit letztem Aufruf:
if GetAsyncKeyState(VK_UP) and 128 = 128 then
Delphi-Quellcode:
Dein Code funktioniert bisher, weil du alle Bits des unteren Nibbles ausmaskiert hast und da ist Bit 0 mit drin. Da MSDN aber nur Bit 0 definiert, verlässt du dich auf das undokumentierte Verhalten, dass alle anderen Bits 0 sind.
if GetAsyncKeyState(VK_UP) and 1 = 1 then
Ansonsten kann natürlich bei einem AND 15 auch 1 rauskommen, ich war bei der Umrechnung mit der 16 verrutscht. Dezimale Angaben sind meist etwas schwerer handlebar bei Bitmasken, da gelobe ich mir lieber hexadezimale Angaben, da sieht man sowas eher. |
Re: Key abfrage
Zitat:
Bekomme immer 0 zurückgeliefert Egal ob ich nur mit der Maus drüber gehe oder drücke hmmm hab irgendwas an der Schüssel heute :) EDIT: Möchte auch nicht abfragen welcher Key gedrückt wurde das weiss ich ja weil ich ihn übergebe sondern den status ob geklickt oder nur drübergefahren. Versuchs mal anders ;) Ich bin innerhalb der WinProc WM_PAINT da kann ich den Status zu dem zeitpunkt nicht gleichzeitig über WinMessagen abfragen deshalb der umweg.
Delphi-Quellcode:
aber es kommt immer 0 bei raus das ist mein problem das mein nächstes Bitmap nicht angezeigt wird
if PtInRect(rc, lp) then
if IsLButtonDown <> 0 then if ButtonHandle = GetFocus() then begin if (GetCursor = LoadCursor(0, IDC_ARROW)) and (StateMax > 1) then UseState := 2; end else if StateMax > 4 then UseState := 5 else begin if StateMax > 2 then UseState := 3; end; wenn ich mit der Maus drüberfahre. gruss EMil |
Re: Key abfrage
Hallo,
Zitat:
Für die "erweiterte" Fragestellung von Emil scheint es jedenfalls nicht geeignet zu sein. PS.: Mein Code bestand genau aus der hier geposteten Zeile, die Funktion habe ich ansonsten bisher noch nicht benötigt. |
Re: Key abfrage
Zitat:
Da ich nicht abfragen will ob der status schon mal gedrückt war sondern nur welcher aktuell ist. Aber trotz alledem funktioniert es nicht. Unter Basic hab ich kein problem mit dem oben geposteten code schnipsel gruss Emil |
Re: Key abfrage
Zitat:
Delphi-Quellcode:
Alternativ:
if GetAsyncKeyState(33) and 128 = 128 then
Delphi-Quellcode:
if GetAsyncKeyState(33) < 0 then
|
Re: Key abfrage
Zitat:
Warum muss ich hier eine IF abfrage stellen ich übergebe doch den wert
Delphi-Quellcode:
IsLButtonDown übergibt den wert 1 und ich erwarte von meiner Funktion die rückgabe wie der status ist
function IsKeyDown(CheckKey: Integer): SmallInt;
begin result := (GetAsyncKeyState(CheckKey) and 15); end; function IsLButtonDown: Integer; begin Result := IsKeyDown(1); end; also in dem Fall
Delphi-Quellcode:
Wie sollte es deiner meinung nach funktionieren ?
result := (GetAsyncKeyState(1) and 15);
Delphi-Quellcode:
Ich brauche doch die IF abfrage nicht..
result := (GetAsyncKeyState(1) and 128); ?
Oder wir reden aneinander vorbei ;) Danke für deine Hilfe .. habs vergessen gruss Emil |
Re: Key abfrage
Du hast alle deine Funktionen mit einem SmallInt bzw. Integer versehen.
Delphi-Quellcode:
Solche Funktionen sind überhaupt nicht aussagekräftig und macht es einem um so schwerer dir zu helfen. Mit was wird denn das Result nach dem Aufruf verglichen? Mit 14? 55? 42? oder gleich mit Random(MaxInt)?
function IsLButtonDown: Integer;
begin Result := IsKeyDown(1); end; Was willst du denn nun eigentlich haben? Doch eigentlich ein boolsches Ergebnis, oder nicht? Wenn ja, dann einfach die IF Abfrage komplett auf eine einzeilige Evaluierung umstellen, da die IF Abfrage einen boolschen Ausdruck braucht, ist das einfach gemacht:
Delphi-Quellcode:
Alternativen:
function IsLButtonDown: boolean;
begin result := ( GetAsyncKeyState(VK_LBUTTON) and 128 ) <> 0; end;
Delphi-Quellcode:
function IsLButtonDown: boolean;
begin result := ( GetAsyncKeyState(VK_LBUTTON) and 128 ) = 128; end;
Delphi-Quellcode:
function IsLButtonDown: boolean;
begin result := GetAsyncKeyState(VK_LBUTTON) < 0; end; |
Re: Key abfrage
Hallo,
nur am Rande bemerkt: 1 shl 15 <> 128 Gruß Hawkeye |
Re: Key abfrage
@Roachford
Zitat:
Delphi-Quellcode:
Solche veralteten Methoden(variablen) wie Boolean wirst du in PowerBasic nicht mehr finden.
function IsKeyDown(CheckKey: Integer): SmallInt;
begin result := (GetAsyncKeyState(CheckKey) and 15); end; function IsLButtonDown: Integer; begin Result := IsKeyDown(1); // 1 <<<<<<< selbe wie VK_LBUTTON davon der aktuelle status zurück geliefert // was ist da nicht verständlich.. hmm end; Aber egal trotzdem danke für deine Hilfe. gruss Emil |
Re: Key abfrage
Zitat:
Zitat:
Zitat:
Und um nochmal auf den richtigen Einwand von Hawkeye219 einzugehen, ersetze in den Codes von mir bitte die 128 mit 32768. Danke! |
Re: Key abfrage
Zitat:
Mich interessiert letztendlich nur der positive oder negative wert. da reicht ein vergleich auf < 0 .. völlig aus Einen schönen Abend noch und Danke für die Hilfe. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:55 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 by Thomas Breitkreuz