Hi,
da das Problem immer wieder kommt "wie kann ich außerhalb meines Programmes auf das Drücken der XYZ-Taste reagieren" oder so ähnlich, und es dann die nächsten Probleme gibt "mein
Hook funktioniert nicht außerhalb meines Programmes, obwohl es ein globaler ist, was mache ich falsch?", biete ich hier mal eine Komplettlösung an. Wer dies nicht will, findet über die SuFu (in der
DP und per F1) alles über Hooks und was man da falsch machen kann - und wie mans richtig macht.
Ich biete euch hiermit meine Komplettlösung an, eine
DLL, die ich für ein eigenes kleines Programm geschrieben habe, um auf die Druck-Taste zu reagieren. Ihr müsst lediglich noch die Auswertung der Eingaben vornehmen, das kann ich euch leider nicht abnehmen, da ich euer Problem nicht kenne.
Also, ihr packt die
DLL aus dem Anhang in euer Programmverzeichnis. Dann fügt ihe irgendwo ganz oben in eurer
Unit, noch vor der Deklaration eures Formulars, folgendes ein:
Delphi-Quellcode:
const
WM_HookCallback = WM_USER + 234;
Die 234 ist eher zufällig entstanden. Wichtig ist, dass eure Message größer ist als WM_USER.
Dann geht ihr in die Deklaration eures Formulars und fügt unter private folgendes ein:
procedure HookCallback(var Message: TMessage); message WM_HookCallback;
Außerdem müsst ihr natürlich die
DLL einbinden:
Delphi-Quellcode:
const
FASPHook = 'FASPHook';
function SetHook(Window: HWND; Callback: LongWord): Boolean; stdcall;
external FASPHook;
function RemoveHook: Boolean; stdcall;
external FASPHook;
Und ihr braucht das hier:
Delphi-Quellcode:
procedure TNameEuresFormulares.HookCallback(
var Message: TMessage);
begin
//Hier müsst ihr dann prüfen, ob die richtige Taste gedrückt/losgelassen wurde
//in wParam steht der VK-Code
//in lParam alle möglichen Infos über den Tastendruck
//genaueres im MSDN
end;
MSDN-Link:
http://msdn.microsoft.com/de-de/libr...us,VS.85).aspx
Die Parameter lParam, wParam und der Rückgabewert (Result) befinden sich im Parameter Msg, welcher ein Record ist. Um die Verarbeitung von Code müsst ihr euch nicht kümmern, das übernimmt die
DLL für euch. Ihr müsst also kein CallNextHookEx aufrufen.
Über SetHook, wo ihr das
Handle eures Formulares sowie die WM_HookCallback übergibt, könnt ihr den
Hook nun starten. RemoveHook entfernt ihn wieder. Es wird jeweils false bei Fehlern zurückgegeben, ansonsten irgendein True.
Beispiel:
Delphi-Quellcode:
//im OnCreate
if not SetHook(
Handle, WM_HookCallback)
then
begin
ShowMessage(StrKbdHookStartError);
Application.ShowMainForm := false;
Application.Terminate;
exit;
end;
//im OnDestroy
RemoveHook;
Viel Spaß noch mit der
DLL. Ihr dürft sie in euren Freeware-Programmen nutzen. Gebt dann bitte meinen Namen und den Link zu
http://faltersoft.de/ in den Credits an.
Was ihr nicht dürft, ist, die Tastatureingaben fremder Leute mitzuprotokollieren. Darauf möchte ich noch einmal hinweisen. Auch wenn ihr noch so gerne das E-Mail-Passwort eurer Freundin wissen wollt, um herauszufinden, mit wem sie fremdgeht.
Source gibts in der
DP, wenn ihr die SuFu nutzt. Ich weiß noch nicht genau, was ich mit dem Programm vorhabe, also werde ich es ohne Source veröffentlichen. Wie gesagt, wer suchet, der findet.
Mfg
FAlter