AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Tastaturhook -> Tasten manupulieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tastaturhook -> Tasten manupulieren

Ein Thema von webby · begonnen am 16. Apr 2003 · letzter Beitrag vom 20. Jun 2003
Antwort Antwort
Seite 3 von 3     123   
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#21
  Alt 20. Jun 2003, 12:10
Moin Stefano,

Zitat von Stefano:
Wenn die Taste gedrückt wird, kommt ganz normal 0, aber wenn man sie loslässt 128. Warum?
Bei dem Feld Flags handelt es sich um ein Bitfield, dass heisst:
Um an die verschiedenen enthaltenen Informationen zu gelangen, muss man die jeweils interessanten Bits ausmaskieren.
Ausmaskieren heisst: Alle Bits bis auf das zu prüfende (oder die zu prüfenden) werden auf 0 gesetzt.

Zitat von MSDN:
7
Specifies the transition state. The value is 0 if the key is pressed and 1 if it is being released.
Bit 7 (die Bits werden von rechts nach links, nullbasiert, durchnummeriert) gibt den Transistion State wieder.
Um nur dieses zu erhalten, und die anderen auf 0 zu setzen, muss das Feld Flags mit einem Wert logisch und (AND) verknüpft werden, der nur an dieser Stelle eine 1 enthält (Hex: 00000080).
Da LLKHF_UP dieses tun soll, gehe ich mal davon aus, dass es den genannte Wert enthält.

Delphi-Quellcode:
if (flag and LLKHF_UP) = LLKHF_UP then // Taste wurde losgelassen
                                  else // Taste wurde gedrückt
Jetzt klärt sich wohl auch das pendeln zwischen 0 und 128. 80 Hex ist 128 Dezimal (16*8)

Dieses ausmaskieren von Bits findest Du an vielen Stellen, z.B. auch bei den FileAttributes wenn Du FindFirst verwendest (faDirectory wäre beispielsweise so eine Maske).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#22
  Alt 20. Jun 2003, 13:37
Hi,

ahsooo , ich glaub so langsam komme ich dahinter.
Allerdings gibts damit 2 Probleme.
Zum einen ist meinem Delphi das Flag LLKHF_UP nicht bekannt. Ich habs dann in meinem Projekt als Konstante mit Wert 7 deklariert (so wegen 7tes Bit).
Wenn ich mir dann zum Testen mal den Wert dieses Flags ausgeben lasse

showmessage(inttostr(PKBDLLHOOKSTRUCT(lparam).flags and LLKHF_UP)); (was hoffentlich richtig ist), wird mir bei beiden Ereignissen (beim Drücken und Loslassen) eine Null angezeigt.
Hab ich bei der Flag- Deklaration irgendwas falsch gemacht, oder Frage ich das Flag noch falsch ab?

Bis dann,

S - tefano
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#23
  Alt 20. Jun 2003, 13:48
Moin Stefano,

wie ich es auch schon geschrieben habe:

Das Bit 7 hat den dezimalen Wert 2 hoch 7 also 128 oder $80
Daher kommt doch auch der Wechsel zwischen 0 und 128 den Du beobachtet hast.

(Bit 6 dann 2 hoch 6 usw.)

Was die Deklaration derartiger Konstanten angeht:
Wenn Du über eine entsprechende Anbindung verfügst, lade Dir mal das PSDK runter. Da sind dann auch Header Dateien dabei, in denen solche Konstanten deklariert sind.

In diesem speziellen falle wäre das allerdings nicht mal notwendig, da die Doku die Wert indirekt schon angibt.

Verbinde einfach mal die Information welches Bit was angibt, mit der Information welche Konstante welche Bits anspricht. Daraus ergibt sich dann zwangsläufig, welche Konstante welchen Wert haben muss.

Die Aktion mit dem ausmaskieren noch mal etwas sichtbarer (alle Angaben jetzt im Binärformat, auf 8 Bit reduziert)

Code:
Der eingelesene Wert (Beispiel) : 10111001
Die Konstante LLKHF_UP         : 10000000
Beide mit AND verknüpft        : 10000000
                                  !      !--> Bit 0
                                  !---------> Bit 7
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von S - tefano
S - tefano

Registriert seit: 16. Dez 2002
Ort: Dülmen
477 Beiträge
 
Delphi 2009 Professional
 
#24
  Alt 20. Jun 2003, 16:33
Hi,

hmmmmhmmmmhmmmm
Also ich sag mal so. Wo da jetz der Fehler lag, hab ich nach einigen Überlegungen begriffen.
Funktioniert jetz auch, und ich weiß auch warum.
Aber irgendwie find ichs ja schon schade, dass ich mir ziemlich sicher bin dass ich auf sowas niemals selber kommen werde...
Aber mit der Konstante als $80 läufts jetz.

Delphi-Quellcode:
          if (PKBDLLHOOKSTRUCT(lparam).flags and LLKHF_UP) = LLKHF_UP then
            showmessage(keystr + ' UP')
          else
            showmessage(keystr);
Und obiger Code funktioniert endlich wunderbar.

Also nochmal vielen Dank für die Hilfe,

S - tefano
"Sir, we are surrounded!" - "Excellent, we can attack in every direction!"
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#25
  Alt 20. Jun 2003, 17:06
Moin Stefano,

bitte, gerne.

Zitat von S - tefano:
Aber irgendwie find ichs ja schon schade, dass ich mir ziemlich sicher bin dass ich auf sowas niemals selber kommen werde...
das ist natürlich auch Übungssache.

Was dabei helfen kann ist die Beschäftigung mit dem Binärsystem, und logischen Verknüpfungen/Operatoren (and, or, xor, not, shl, shr).

Da dieses Verfahren in der API öfter eingesetzt wird, kann's nicht schaden sich mal damit zu beschäftigen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 02:46 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