Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Key abfrage (https://www.delphipraxis.net/121872-key-abfrage.html)

EWeiss 6. Okt 2008 11:19


Key abfrage
 
In Basic frage ich den Status von einem Key so ab
Delphi-Quellcode:
'// 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
Wie kann ich das für nonvcl in Delphi abfragen ?
Hab hier beim suchen nicht das passende gefunden

gruss Emil

Luckie 6. Okt 2008 11:27

Re: Key abfrage
 
Es gibt die Nachrichten MSDN-Library durchsuchenWM_CHAR, MSDN-Library durchsuchenWM_KEYDOWN und MSDN-Library durchsuchenWM_KEYUP.

nahpets 6. Okt 2008 11:29

Re: Key abfrage
 
Hallo Emil,

so?
Delphi-Quellcode:
 if (GetAsyncKeyState(33) and 15) = 1 then ShowMessage('ist gedrückt') else ShowMessage('ist nicht gedrückt');
33 = Bild auf
34 = Bild ab

GetAsyncKeyState ist in Windows.pas definiert.

EWeiss 6. Okt 2008 11:31

Re: Key abfrage
 
Zitat:

Zitat von Luckie
Es gibt die Nachrichten MSDN-Library durchsuchenWM_CHAR, MSDN-Library durchsuchenWM_KEYDOWN und MSDN-Library durchsuchenWM_KEYUP.

Ich muss den außerhalb der Winproc prüfen
Ansonsten ist das richtig was du sagst ;)

gruss Emil

EWeiss 6. Okt 2008 11:33

Re: Key abfrage
 
Zitat:

Zitat von nahpets
Hallo Emil,

so?
Delphi-Quellcode:
 if (GetAsyncKeyState(33) and 15) = 1 then ShowMessage('ist gedrückt') else ShowMessage('ist nicht gedrückt');
33 = Bild auf
34 = Bild ab

GetAsyncKeyState ist in Windows.pas definiert.

Jo danke das kann ich mir hinbiegen wie ich es brauche ;)

Danke für eure Hilfe.
Wenns mal fertig stell ich den Source Online

EDIT:
Also das richtige resultat bekomme ich nicht

Delphi-Quellcode:
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;
wird immer 0 zurückgegeben .. hmm

gruss Emil

Roachford 6. Okt 2008 11:46

Re: Key abfrage
 
Zitat:

Zitat von nahpets
Hallo Emil,

so?
Delphi-Quellcode:
 if (GetAsyncKeyState(33) and 15) = 1 then ShowMessage('ist gedrückt') else ShowMessage('ist nicht gedrückt');
33 = Bild auf
34 = Bild ab

So, und nun nochmal überlegen, was denn für ein Wert rauskommt, wenn Bit 15 gesetzt ist. Mich dünkt, es ist nicht 1...

nahpets 6. Okt 2008 11:49

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.

Roachford 6. Okt 2008 11:54

Re: Key abfrage
 
Zitat:

Zitat von nahpets
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.

Das ist nett - einfach programmieren, klappt derzeit. Schick. Und was die Funktion zurück gibt ist auch unbedeutend? Klasse, deine Programme sorgen bestimmt für Heiterkeit bei den Abnahmen...

Zur Klärung einfach mal die Dokumentation anschauen und nicht einfach nur kopieren...

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:
if GetAsyncKeyState(VK_UP) and 128 = 128 then
Status seit letztem Aufruf:
Delphi-Quellcode:
if GetAsyncKeyState(VK_UP) and 1 = 1 then
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.

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.

EWeiss 6. Okt 2008 11:55

Re: Key abfrage
 
Zitat:

Zitat von nahpets
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.

Hast meinen Editierten eintrag angeschaut ;)

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:
             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;
aber es kommt immer 0 bei raus das ist mein problem das mein nächstes Bitmap nicht angezeigt wird
wenn ich mit der Maus drüberfahre.


gruss EMil

nahpets 6. Okt 2008 12:13

Re: Key abfrage
 
Hallo,
Zitat:

Zitat von Roachford
Das ist nett - einfach programmieren, klappt derzeit. Schick. Und was die Funktion zurück gibt ist auch unbedeutend? Klasse, deine Programme sorgen bestimmt für Heiterkeit bei den Abnahmen...

Zur Klärung einfach mal die Dokumentation anschauen und nicht einfach nur kopieren...

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:
if GetAsyncKeyState(VK_UP) and 128 = 128 then
Status seit letztem Aufruf:
Delphi-Quellcode:
if GetAsyncKeyState(VK_UP) and 1 = 1 then
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.

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.

mir ging es um nicht mehr, als festzustellen, dass die Funktion in Windows.pas definiert ist und somit für Delphi zur Verfügung steht und dass ein billiges "abschreiben" des im ersten Post geschriebenen Quelltextes zu einem Ergebnis führt, ob und in welchem Umfang dies jetzt für eine beliebige sinnvolle Verwendung geeignet ist, steht auf einem anderen Blatt.

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.

EWeiss 6. Okt 2008 12:27

Re: Key abfrage
 
Zitat:

Mein Code bestand genau aus der hier geposteten Zeile, die Funktion habe ich ansonsten bisher noch nicht benötigt.
Und da war es auch korrekt
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

Roachford 6. Okt 2008 15:04

Re: Key abfrage
 
Zitat:

Zitat von EWeiss
Unter Basic hab ich kein problem mit dem oben geposteten code schnipsel

Der Code entspricht dem folgenden:

Delphi-Quellcode:
if GetAsyncKeyState(33) and 128 = 128 then
Alternativ:

Delphi-Quellcode:
if GetAsyncKeyState(33) < 0 then

EWeiss 6. Okt 2008 15:45

Re: Key abfrage
 
Zitat:

Zitat von Roachford
Zitat:

Zitat von EWeiss
Unter Basic hab ich kein problem mit dem oben geposteten code schnipsel

Der Code entspricht dem folgenden:

Delphi-Quellcode:
if GetAsyncKeyState(33) and 128 = 128 then
Alternativ:

Delphi-Quellcode:
if GetAsyncKeyState(33) < 0 then

Ich habe aber ein Problem damit gut ist ein Sample von dir. ;)
Warum muss ich hier eine IF abfrage stellen ich übergebe doch den wert

Delphi-Quellcode:
function IsKeyDown(CheckKey: Integer): SmallInt;
begin
    result := (GetAsyncKeyState(CheckKey) and 15);

end;

function IsLButtonDown: Integer;
begin
    Result := IsKeyDown(1);

end;
IsLButtonDown übergibt den wert 1 und ich erwarte von meiner Funktion die rückgabe wie der status ist
also in dem Fall

Delphi-Quellcode:
result := (GetAsyncKeyState(1) and 15);
Wie sollte es deiner meinung nach funktionieren ?
Delphi-Quellcode:
result := (GetAsyncKeyState(1) and 128); ?
Ich brauche doch die IF abfrage nicht..
Oder wir reden aneinander vorbei ;)
Danke für deine Hilfe .. habs vergessen

gruss Emil

Roachford 6. Okt 2008 18:09

Re: Key abfrage
 
Du hast alle deine Funktionen mit einem SmallInt bzw. Integer versehen.

Delphi-Quellcode:
function IsLButtonDown: Integer;
begin
  Result := IsKeyDown(1);
end;
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)?

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:
function IsLButtonDown: boolean;
begin
  result := ( GetAsyncKeyState(VK_LBUTTON) and 128 ) <> 0;
end;
Alternativen:
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;

Hawkeye219 6. Okt 2008 18:34

Re: Key abfrage
 
Hallo,

nur am Rande bemerkt: 1 shl 15 <> 128

Gruß Hawkeye

EWeiss 6. Okt 2008 18:49

Re: Key abfrage
 
@Roachford
Zitat:

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)?
Was ist da nicht aussagekräftig ?
Delphi-Quellcode:
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;
Solche veralteten Methoden(variablen) wie Boolean wirst du in PowerBasic nicht mehr finden.
Aber egal trotzdem danke für deine Hilfe.

gruss Emil

Roachford 6. Okt 2008 19:50

Re: Key abfrage
 
Zitat:

Zitat von Hawkeye219
nur am Rande bemerkt: 1 shl 15 <> 128

Shit, da habe ich ja vollkommen falsch gerechnet. Vielen Dank, Hawkeye219!

Zitat:

Zitat von EWeiss
Was ist da nicht aussagekräftig ?
Delphi-Quellcode:
function IsKeyDown(CheckKey: Integer): SmallInt;
begin
    result := (GetAsyncKeyState(CheckKey) and 15);

end;

function IsLButtonDown: Integer;
begin
    Result := IsKeyDown(1);
    // 1 <&lt;&lt;&lt;&lt;&lt;&lt; selbe wie VK_LBUTTON davon der aktuelle status zurück geliefert
    // was ist da nicht verständlich.. hmm
end;

Daran ist vor allem nicht aussagekräftig, dass IsKeyDown() einen SmallInt und IsLButtonDown einen Integer zurückliefert. Also wird eine Zahl zurück geliefert - und mit was wird der Rückgabewert verglichen? Von mir aus beachten wir nur die Funktion IsLButtonDown(), da die andere darin aufgerufen wird. Und für die Funktion (IsLButtonDown()) hast du niemals in diesem Thread einen Aufruf gepostet. Mit anderen Worten, ich weiss nicht, mit was du den Rückgabewert der Funktion vergleichst (siehe Beitrag zuvor: 42?, Random(MaxInt)?). Somit ist es undurchsichtig, unverständlich[b] und machen es einfach schwer, dir direkt zu helfen.

Zitat:

Zitat von EWeiss
Solche veralteten Methoden(variablen) wie Boolean wirst du in PowerBasic nicht mehr finden.

Ich habe selber jahrelang auch PowerBasic programmiert und ich weiss dies, aber was (zum Teufel) hat nun auf einmal PowerBasic mit dem ganzen Thread zu tun? Ich denk du willst das ganze in Delphi machen und nicht in PowerBasic. Was denn nun? Bist du dir überhaupt einig was du machen willst? PowerBasic oder Delphi? Willst du den Code richtig machen (Boolean) oder einfach nur rumfrickeln (SmallInt auf Integer erweitern lassen und dann mit dem Wert x vergleichen)?

Und um nochmal auf den richtigen Einwand von Hawkeye219 einzugehen, ersetze in den Codes von mir bitte die 128 mit 32768. Danke!

EWeiss 6. Okt 2008 20:07

Re: Key abfrage
 
Zitat:

ersetze in den Codes von mir bitte die 128 mit 32768. Danke!
Das benötige ich nicht.
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 10:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz