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