AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Tastatur-Hook funktioniert nicht für alle Anwendungen
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatur-Hook funktioniert nicht für alle Anwendungen

Ein Thema von MiB-Agent · begonnen am 10. Jan 2010 · letzter Beitrag vom 12. Jan 2010
Antwort Antwort
MiB-Agent

Registriert seit: 10. Aug 2009
5 Beiträge
 
#1

Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 10. Jan 2010, 18:07
Moin moin

Ich versuche mich zur Zeit an der Programmierung mit Tastatur-Hooks, und bin dabei auf folgendes Problem gestoßen:
Mein Tastatur-Hook funktioniert nicht für alle Anwendungen, die gerade laufen, sondern nur bisher nur für meine eigene Anwendung, dem Windows-Notepad und dem Windows-Explorer. Tastatureingaben, welche an andere Anwendungen gesendet werden, kann mein Hook nicht registrieren.
Ich hab mich am Tutorial von Assarbad orientiert und den Grundquellcode im Wesentlichen übernommen. Ich poste einfach mal die entscheidenden Teile aus meinem Quellcode:

DLL:
Delphi-Quellcode:
library keyboardhook;

uses
  Windows,
  Messages,
  Dialogs,
  SysUtils;

var
  HookHandle: Cardinal = 0;
  AppHandle: HWND;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
  Result := CallNextHookEx(HookHandle,
                           nCode,
                           wParam,
                           lParam);
  if nCode = HC_NOREMOVE then
    Exit;
// if nCode = HC_ACTION then
    begin
    PostMessage(AppHandle,
                WM_USER + 1235,
                wParam,
                lParam);
    end;
end;

function InstallHook(ApplicationHandle: HWND): Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then
    begin
    HookHandle := SetWindowsHookEx(WH_KEYBOARD,
                                   @KeyboardHookProc,
                                   HInstance,
                                   0);
    AppHandle := ApplicationHandle;
    Result := TRUE;
    end;
end;

function UninstallHook: Boolean; stdcall;
begin
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
  InstallHook,
  UninstallHook;
end.
Hauptanwendung:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, Math, Menus, Grids, Unit2, IniFiles;

type
//...
  TFoMain = class(TForm)
//...
    Memo1: TMemo;
    TiHook: TTimer;
//...
    procedure TiHookTimer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure DllMessage(var Msg: TMessage); message WM_USER + 1235;
//...
  end;

  function InstallHook(AppHandle: HWND): Boolean; stdcall; external 'keyboardhook.dll';
  function UninstallHook: Boolean; stdcall; external 'keyboardhook.dll';
//...

implementation

{$R *.dfm}

procedure TFoMain.TiHookTimer(Sender: TObject);
begin
  TiHook.Enabled := False;
  InstallHook(Handle);
end;

procedure TFoMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UninstallHook;
end;

procedure TFoMain.DllMessage(var Msg: TMessage);
var
  Index,
  CharIndex,
  SlotIndex,
  CommandIndex: Integer;
begin
  Memo1.Lines.Add(IntToStr(Msg.WParam) + ' / ' + IntToStr(Msg.LParam));
//...
end;

//...

end.
Die Funktion DllMessage empfängt halt alle Messages, die der Hook sendet und soll sie theoretisch erst einmal nur auflisten. Das funktioniert praktisch auch, aber nicht für alle Anwendungen. Wie gesagt, wenn ich im Notepad etwas schreibe, dann werden in meinem Memo-Feld auch alle Eingaben aufgelistet, aber bei meinem ICQ-Chatfenster beispielsweise, bleibt mein Memo-Feld leer.

Bin für jede Hilfe dankbar

MfG
MiB-Agent
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#2

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 11. Jan 2010, 09:46
Zitat von MiB-Agent:
..Tastatur-Hook funktioniert nicht für alle Anwendungen,
Hallo MiB-Agent, welches OS verwendest du?

64Bit Applikation zu 64 Bit Hook
32Bit Applikation zu 32 Bit Hook

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
MiB-Agent

Registriert seit: 10. Aug 2009
5 Beiträge
 
#3

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 11. Jan 2010, 22:46
Ich verwende zur Zeit Windows XP 64-bit.

Allerdings ist mir noch nicht ganz klar, was ich jetzt genau ändern muss. Ist die DLL für den Keyboard-Hook automatisch nur für 64-bit Anwendungen verwendbar, weil das Betriebssystem 64-bit ist?
Was ich auf jeden Fall brauche, ist ein Hook der speziell für 32-bit Anwendungen funktioniert.
Ich bräuchte halt nur einen kleinen Hinweis, wie ich explizit einen 32-bit-Hook erstellen kann.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#4

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 11. Jan 2010, 22:56
Zitat von MiB-Agent:
Ich verwende zur Zeit Windows XP 64-bit.
Allerdings ist mir noch nicht ganz klar, was ich jetzt genau ändern muss. Ist die DLL für den Keyboard-Hook automatisch nur für 64-bit Anwendungen verwendbar, weil das Betriebssystem 64-bit ist?
Was ich auf jeden Fall brauche, ist ein Hook der speziell für 32-bit Anwendungen funktioniert.
Ich bräuchte halt nur einen kleinen Hinweis, wie ich explizit einen 32-bit-Hook erstellen kann.
Hallo MiB-Agent, für einen globalen 32 Bit Hook brauchst Du einen 32 Bit Compiler, zB. Delphi.
Damit werden dann unter einem Win64 Os alle 32 Bit Applicationen mit der erstellten DLL gehookt (Privileges beachten).

Für einen globalen 64 Bit Hook brauchst Du einen 64 Bit Compiler, zB. FreePascal (FPC) mit Lazarus IDE.

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
MiB-Agent

Registriert seit: 10. Aug 2009
5 Beiträge
 
#5

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 11. Jan 2010, 23:05
Also ich hab sowohl meine eigene Anwendung als auch die DLL mit Delphi 2009 erstellt, und zumindest in der Prozessliste steht hinter meiner Anwendung auch das "*32"-Symbol. Aber ich weiß nicht, ob man beim Compilieren der DLL noch irgendwas beachten muss, damit die auch wirklich 32-bit wird.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#6

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 11. Jan 2010, 23:15
Zitat von MiB-Agent:
Also ich hab sowohl meine eigene Anwendung als auch die DLL mit Delphi 2009 erstellt, und zumindest in der Prozessliste steht hinter meiner Anwendung auch das "*32"-Symbol. Aber ich weiß nicht, ob man beim Compilieren der DLL noch irgendwas beachten muss, damit die auch wirklich 32-bit wird.
Nein, die BorInpriseEmbacos haben nur einen 32 Bit Compiler für Delphi.
Also alles was Du unter Delphi > 1, Compillierst ist 32 Bit.

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
MiB-Agent

Registriert seit: 10. Aug 2009
5 Beiträge
 
#7

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 12. Jan 2010, 00:16
Ich hab jetzt mal meine alte 32-bit XP-Version gestartet und meine Anwendung und den Hook getestet. Seltsamerweise funktioniert der dort überhaupt nicht, außer in meiner Hauptanwendung selbst.
Hab die unter 64-bit compilierte Version getestet und danach nochmal unter dem 32-bit System neucompiliert, aber funktioniert hat es in beiden Fällen nicht.

Astat, was genau meintest du damit:
Zitat:
Damit werden dann unter einem Win64 Os alle 32 Bit Applicationen mit der erstellten DLL gehookt (Privileges beachten).
Was für Previlegien brauch ich für einen Hook denn genau? Ich bin auf jeden Fall mit meinem Administrator-Account angemeldet. (Also halt der, der bei der Windows-Installation standardmäßig als erster verfügbar ist und "Administrator" heißt)
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#8

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 12. Jan 2010, 09:07
Zitat von MiB-Agent:
Ich hab ..den Hook getestet. Seltsamerweise funktioniert der dort überhaupt nicht, außer in meiner Hauptanwendung selbst.
Ja, ist Klar Du verwendest das AppHandle , dass kennt eine gehookte Applikation nicht.
Du musst Hier eine (IPC) InterprozessKommunikation mit Shared Mem, Pipes, Messages(WM_COPY_DATA), Sockets usw. implementieren, um mit
der Host Applikation zu schwatzen.

    PostMessage(AppHandle,... lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
MiB-Agent

Registriert seit: 10. Aug 2009
5 Beiträge
 
#9

Re: Tastatur-Hook funktioniert nicht für alle Anwendungen

  Alt 12. Jan 2010, 11:44
Zitat:
Ja, ist Klar Du verwendest das AppHandle , dass kennt eine gehookte Applikation nicht.
Stimmt, daran hat es gelegen...
Hab das Apphandle jetzt durch FindWindow ersetzt, so dass die DLL das Fenster selbst sucht, damit funktioniert es einwandfrei.

Danke nochmal für deine Hilfe, Astat


MfG
MiB-Agent
  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 12:26 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