Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Hooks - unterschiedliche Anzahl der abgefangenen Nachrichten (https://www.delphipraxis.net/118339-hooks-unterschiedliche-anzahl-der-abgefangenen-nachrichten.html)

No_King 5. Aug 2008 19:10


Hooks - unterschiedliche Anzahl der abgefangenen Nachrichten
 
Hallo,
ich habe mich gerade eben erst registriert und wollte erst einmal Danke sagen. Ich finde diese Seite ehct Klasse und sie hat mir schon oft geholfen. Nun bin ich aber auf ein Problem gestoßen auf das cih wedre hie rncoh bei Google eine ANtwort gefunden habe.

Und zwar habe ich mich in der letzten Zeit mit Hooks beschäftigt. Das meißte konnte ich mir über verschiedene Tutoritals selbst erklären, doch nun bin ich auf ein Problem gestoßen, bei dem ich nicht weiter komme.


Delphi-Quellcode:
function HookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin


  If(nCode >= 0) then
  begin

    if(lparam and $80000000) = 0 then
    begin

      AssignFile(log, GetEnvironmentVariable('SYSTEMROOT') + '\test.txt');
      APPEND(log);
      Write(log,Keycode(wParam));
      CloseFile(log);


    end;

  end;


  Result := CallNextHookEx(Tastaturhook, nCode, wParam, lParam);

end;
Und zwar habe ich versucht die gedrückten Tasten testweise in eine Datei zu schreiben und dabei ist mir aufgefallen, dass wenn ich in Word bin dre entsprechende Buchstabe 6 mal erscheint, in Firefox 2 mal und wenn ich in Delphi tippe 1 mal. Ich habe wirklcih keine Ahnung, wie ich mir dieses Phänomen erklären kann. Ich hoffe ihr könnt mir helfen.

Wenn ich shconeinmal dabei bin, es wäre net wnen mir jemand erklären könnte wraum ich ncode überprüfen muss. Ich habe zwar gelsesen, dass dies ntig ist damit WIndows die Kontrolle über die Hookchain behalten kann, jedoch habe ich nciht verstandne warum. Was passiert wenn ich ncode nciht überprüfe? Ich würde einfahc gerne alles verstehen, was ich programmiere.

Vielen Dank für eure Hilfe.

Mit freundlichen Grüßen

No_King

Apollonius 5. Aug 2008 19:32

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Auch Code und lParam enthalten nützliche Daten, die du mitprotokollieren solltest. Es kann zum Beispiel passieren, das eine Anwendung PeekMessage mit dem Flag PM_NOREMOVE verwendet und so eine Nachricht mehrfach durch die Funktion geschleust wird. Dies siehst du dann an Code.

No_King 5. Aug 2008 20:24

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Genau das war ein weiteres Problem von mir. Wie kann ich den Wert lparam auswerten? WParam war ja vom Typ integer, aber was ist mit lParam?

Apollonius 5. Aug 2008 20:27

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
LParam ist auch ein Integer. :roll:
Zitat:

Zitat von Windows.pas
Delphi-Quellcode:
type LPARAM = Longint;


No_King 5. Aug 2008 20:30

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
ups.. Tut mir leid. Gibt es irgendwie eine Auflistung der Bedeutung dre einzelnen Integer-Werte. Bei WParam konnte ich ja einfach die virtuellen Tastencodes nutzen. Ich habe leider bis jetzt noch nichts gefunden.

Apollonius 5. Aug 2008 20:31

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Die Dokumentation hilft.

No_King 5. Aug 2008 20:41

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Ah vielen Dank. Die Dokumentation hab ich schon gesucht gehabt, war nur zu blöd sie zu finden. Habe aber irgendwo mal gelesen, dass ich zur AUswertung die vershciedenen Bits auslesen muss. Das folgende wird ja wohl kaum gehen:

Delphi-Quellcode:

if(lparam = 24) then
begin



end;
Im weiteren habe ich dann soetwas gefunden, nur kann ich dies mit meinen herkömmlichen Kenntnissen von if-Anweisungen und AND nicht verstehen:

Delphi-Quellcode:

if(lparam and $80000000) = 0 then
begin

Vielen Dank für deine sehr schnelle Hilfe. :thumb:

HalloDu 5. Aug 2008 20:54

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Dort ist AND auch nicht logisch (naja eigentlich schon) sonder binär gemeint. Das bedeutet bei zwei Werten, die mit AND verknüpft sind, dass nachher nur die Bits 1 sind, die bei beiden 1 waren.
BSP:
Code:
   
--------------
    1110110001
AND 1101001111
--------------
=  1100000001
--------------
Das benutzt man meisten um auf das Vorhandensein einzellner Bits in einem Wert zu prüfen.
Wenn z.B. Wert AND 2 > 0 dann ist das zweite Bit gesetzt. Wenn z.B. Wert AND 4 > 0 dann ist das dritte Bit gesetzt. Wenn z.B. Wert AND 8 > 0 dann ist das vierte Bit gesetzt. usw...

[edit] Diverse Dinge, die ich mal wieder nicht nachgeprüft habe, bevor ich gepostet habe. PS: Das Dollarzeichen gibt an das das eine Hexzahl ist, auch sehr beliebt für Binärzahlen, da jede Ziffer 4 Bit entspricht.[/edit]

[edit] Für ein gutes Tutorial zu dem Thema klick [/edit]

No_King 5. Aug 2008 21:17

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Danke das du dich so ausführlich mit meinem Problem beschäftigt hast.

Nochmal ein kurzes Beispiel um zu sehen, ob iches verstanden hab:

Delphi-Quellcode:

if(lparam AND 24 > 0) then
begin


end;
Damit frage ich als ab ob es sich um einen Extended-Key handelt, stimmt das?



@Apollonius:

Auch an dich noch einmal Danke. Du hattest recht mit der PeekMessage mit dem Flag PM_NOREMOVE. ICh habe den Code nun dahingehend verändert, dass ich überprüfe ob ncode <> 3 ist.

Delphi-Quellcode:

If(nCode >= 0) AND (nCode <> 3) then
begin

end;
Jetzt funktioniert es ohne Probleme und ich weiß endlich wie ich lParam auslesen kann.

HalloDu 5. Aug 2008 21:34

Re: Hooks - unterschiedliche Anzahl der abgefangenen Nachric
 
Leider noch nicht ganz. Mit 24 ist nicht die Zahl gemeint sonder das 24 Bit deines 32 Bit-Integers. So wie 2 für binär 10 steht. Musst du hier auch das Equivalent zum 24 Bit in Hex oder Dezimal angeben. Also musst du auf diese Zahl 1000 0000 0000 0000 0000 0000 in Hex also auf $800000 prüfen sprich.
Delphi-Quellcode:
if ((lparam AND $800000) > 0) then
  begin
    ...
  end;
[edit] Ich verweißte hier nochmal gerne auf das Tutorial, da wird das sehr anschaulich erklärt. [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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