Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastaturhook -> Tasten manupulieren (https://www.delphipraxis.net/4126-tastaturhook-tasten-manupulieren.html)

Christian Seehase 20. Jun 2003 11:10

Moin Stefano,

Zitat:

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:

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).

S - tefano 20. Jun 2003 12:37

Hi,

ahsooo :idea: , 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

Delphi-Quellcode:
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

Christian Seehase 20. Jun 2003 12: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

S - tefano 20. Jun 2003 15: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

Christian Seehase 20. Jun 2003 16:06

Moin Stefano,

bitte, gerne.

Zitat:

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:46 Uhr.
Seite 3 von 3     123   

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