![]() |
Moin Stefano,
Zitat:
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:
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:
Jetzt klärt sich wohl auch das pendeln zwischen 0 und 128. 80 Hex ist 128 Dezimal (16*8)
if (flag and LLKHF_UP) = LLKHF_UP then // Taste wurde losgelassen
else // Taste wurde gedrückt 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). |
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:
(was hoffentlich richtig ist), wird mir bei beiden Ereignissen (beim Drücken und Loslassen) eine Null angezeigt.
showmessage(inttostr(PKBDLLHOOKSTRUCT(lparam).flags and LLKHF_UP));
Hab ich bei der Flag- Deklaration irgendwas falsch gemacht, oder Frage ich das Flag noch falsch ab? Bis dann, S - tefano |
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 |
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:
Und obiger Code funktioniert endlich wunderbar.
if (PKBDLLHOOKSTRUCT(lparam).flags and LLKHF_UP) = LLKHF_UP then
showmessage(keystr + ' UP') else showmessage(keystr); Also nochmal vielen Dank für die Hilfe, S - tefano |
Moin Stefano,
bitte, gerne. Zitat:
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 16:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz