AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Tastatur Hook funktioniert nicht richtig
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatur Hook funktioniert nicht richtig

Ein Thema von Phil1977 · begonnen am 7. Aug 2012 · letzter Beitrag vom 7. Aug 2012
Antwort Antwort
Phil1977

Registriert seit: 14. Feb 2010
8 Beiträge
 
#1

Tastatur Hook funktioniert nicht richtig

  Alt 7. Aug 2012, 08:25
Hallo,

Ich wollte mich mal in das Thema Hooks einarbeiten und habe zum Anfang mal mit einem vermeindlich einfachen Tastaturhook ausprobiert. Allerdings funktioniert der Hook nicht wie gewollt. Hier zunächst einmal der Code der DLL:

Code:
library KeyboardHook;

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;



var
  HookHandle: Cardinal = 0;
  WindowHandle: Cardinal = 0;
  hook:cardinal;
  hwnd:cardinal;
  hopenfilemap:cardinal=0;
  p:pointer;
  switch:boolean;
  hcreatefilemap:cardinal=0;
  oldproc:pointer;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.


  case nCode < 0 of
    TRUE: exit; //wenn code kleiner 0 wird nix gemacht
                //if code smaller 0 nothing has to be done
    FALSE:
      begin
        Showmessage(inttostr(wparam));
        if (wParam<100)then Result := CallNextHookEx(HookHandle, nCode, 81, 81) //Wenn Tastaturcode kleiner 100, den Code auf 81 ändern
        else Result := CallNextHookEx(HookHandle, nCode, wParam, lParam); //Wenn größer 100, die gedrückte Taste zurück geben
      end;
  end;
end;

function InstallHook(Hwnd: Cardinal): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
//Erstmal Hook installieren
//First install the hook
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc,
    HInstance, 0);
//Uebergebenes Fensterhandle sichern
//Save the given window handle
    WindowHandle := Hwnd;
    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook;
end.
Zum Anfang habe ich in der KeyboardHookProc zunächst einmal versucht die Tastatureingabe auszuwerten und bei bestimmten Tasteneingaben eine andere Taste zurück zu geben. Wird eine Taste mit einem Zeichencode kleiner 100 gedrückt, soll immer die Taste mit dem Code 81 zurück gegeben werden. Wird eine Taste mit einem Code >= 100 gedrückt wird an der Eingabe nichts geändert.
Soweit die Theorie, allerdings funktioniert der Hook nicht richtig. Es wird nämlich mit obigem Code immer die gedrückte Taste zurück gegeben Die KeyboardHookProc wird richtig durchlaufen, das habe ich mit eingebauten Showmessage() zu debuggen schon getestet und wenn der Code <100 wird auch die richtige if schleife durchlaufen aber die Tastatur eingabe wird nicht geändert.
Noch seltsamer ist aber folgendes: Wenn ich in die entsprechende if-else-Schleife zum debuggen jeweils eine Showmessage einbaue funktioniert auf einmal alles wie gewollt:

Code:
 if (wParam<100)then
        begin
          Showmessage('Ein');
          Result := CallNextHookEx(HookHandle, nCode, 81, 81)
          end
        else
          begin
            Showmessage('Aus');
            Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
          end;
Hat jemand eine Idee wodran das liegen könnte?

PS: Bevor jemand fragt, welchen Sinn dieser Hook überhaupt haben soll: Garkeinen! Ich wollte nur zum Anfang mal probieren wie ich die Eingaben auslesen und dann auch verändert zurück geben kann.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Tastatur Hook funktioniert nicht richtig

  Alt 7. Aug 2012, 09:57
Eigentlich kann man in der "KeyboardHookProc" nur zurückgeben, ob die Taste durch den Hook bearbeitet wurde und von der Anwendung deshalb ignoriert werden soll. Eine Änderung des Codes ist nicht möglich.
Der Aufruf von "CallNextHookEx" dient nur dazu weitere "KeyboardHookProc" zu bedienen, die sich ebenfalls für die gedrückten Tasten interessieren. Wenn z.B. ein Utilitie auf die "Druck"-Taste mit einem Screenshoot reagiert, könnte man dieses auslösen, in dem man den entspechenden Tastencode weitergibt.
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:06 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