So, nachdem ich nochmal einen halben Tag lang intensiv gesucht habe, konnte ich endliche eine Lösung finden!
Es gibt noch zwei Hook-Arten, die ich bisher übersehen oder schlicht nicht gefunden habe:
WH_KEYBOARD_LL sowie WH_MOUSE_LL
Diese beiden Low Level Hooks bieten in ihrem Flags einen Parameter an, welcher verrät, ob der Input "real" (Treiberebene) oder "Injected" (
API-Ebene) ist.
Einzige Möglichkeit diesen Hook auszutricksen ist der Einsatz eines "Fake"-HID-Treibers, welcher den Input generiert oder man benutzt den Microsoft Remote Desktop. Den muss man sepperat über GetSystemMetrics abfragen.
Hier die entsprechenden
MSDN-Seiten:
Hier ein kleiner Code-Abriss (ich hab die
THook-Klasse von Jens Borrisholt benutzt):
Delphi-Quellcode:
{ Structure used by WH_KEYBOARD_LL }
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
{ Structure used by WH_MOUSE_LL }
POINT = record
x,y: longint;
end;
MSLLHOOKSTRUCT = record
pt: POINT;
mouseData: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: DWORD;
end;
PMSLLHOOKSTRUCT = ^MSLLHOOKSTRUCT;
const
LLMHF_INJECTED = 1;
{...}
procedure TfrmLLHookMain.KeyboardHookPreExecute(Hook: THook;
var Hookmsg: THookMsg);
var
pKeyHookStruct: PKBDLLHOOKSTRUCT;
KeyHookStruct: KBDLLHOOKSTRUCT;
begin
pKeyHookStruct := PKBDLLHOOKSTRUCT(Hookmsg.LParam);
KeyHookStruct := pKeyHookStruct^;
if KeyHookStruct.flags = LLKHF_INJECTED then
begin
lblKeyInjected.Caption := 'Keyboard: Is Injected Input';
lblKeyInjected.Font.Color := clRed;
end
else
begin
lblKeyInjected.Caption := 'Keyboard: Is Real Input';
lblKeyInjected.Font.Color := clGreen;
end;
end;
procedure TfrmLLHookMain.MouseHookPreExecute(Hook: THook; var Hookmsg: THookMsg);
var
pMouseHookStruct: PMSLLHOOKSTRUCT;
MouseHookStruct: MSLLHOOKSTRUCT;
begin
pMouseHookStruct := PMSLLHOOKSTRUCT(Hookmsg.LParam);
MouseHookStruct := pMouseHookStruct^;
if MouseHookStruct.flags = LLMHF_INJECTED then
begin
lblMouseInjected.Caption := 'Mouse: Is Injected Input';
lblMouseInjected.Font.Color := clRed;
end
else
begin
lblMouseInjected.Caption := 'Mouse: Is Real Input';
lblMouseInjected.Font.Color := clGreen;
end;
end;
Vielen Dank an alle Helfer.
Die
DP hat sich mal wieder bewährt ^^