Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 Uhr.
Seite 1 von 2  1 2      

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