AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Key abfrage

Ein Thema von EWeiss · begonnen am 6. Okt 2008 · letzter Beitrag vom 6. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Key abfrage

  Alt 6. Okt 2008, 12:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Key abfrage

  Alt 6. Okt 2008, 12:27
Es gibt die Nachrichten MSDN-Library durchsuchenWM_CHAR, MSDN-Library durchsuchenWM_KEYDOWN und MSDN-Library durchsuchenWM_KEYUP.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Key abfrage

  Alt 6. Okt 2008, 12:29
Hallo Emil,

so?
 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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: Key abfrage

  Alt 6. Okt 2008, 12:31
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

Re: Key abfrage

  Alt 6. Okt 2008, 12:33
Zitat von nahpets:
Hallo Emil,

so?
 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
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#6

Re: Key abfrage

  Alt 6. Okt 2008, 12:46
Zitat von nahpets:
Hallo Emil,

so?
 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...
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

Re: Key abfrage

  Alt 6. Okt 2008, 12:49
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.
  Mit Zitat antworten Zitat
Roachford
(Gast)

n/a Beiträge
 
#8

Re: Key abfrage

  Alt 6. Okt 2008, 12:54
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:
if GetAsyncKeyState(VK_UP) and 128 = 128 then Status seit letztem Aufruf:
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

Re: Key abfrage

  Alt 6. Okt 2008, 12:55
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
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#10

Re: Key abfrage

  Alt 6. Okt 2008, 13:13
Hallo,
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:
if GetAsyncKeyState(VK_UP) and 128 = 128 then Status seit letztem Aufruf:
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:32 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