Entwickler-Ecke

Windows API - Hook - app.handle in MMF/Registry dann hwndTarget zuweisen?


T.E. - So 14.02.10 15:12
Titel: Hook - app.handle in MMF/Registry dann hwndTarget zuweisen?
Moin moin,
ich habe zwei kleine Probleme:
und zwar code ich derzeit gerade an einem Tool für meine Firma, das überprüfen soll ob die Tasten eines USB Panels, das die Funktionstasten F1 bis F24 auslagert, ordnungsgemäß funktionieren.
So ich habe mich da für eine Hook lösung entschieden und benötige dafür jetzt leider noch mal etwas Hilfe:
Ich habe in der Hook DLL die typischen Funtkionen drin für den aufruf, bzw. die De-/Installation.
In der Aufrufenden Funktion habe ich nun noch folgenden Aufruf, der die gedrückte Taste an das Hauptprogramm weitergeben soll

Delphi-Quelltext
1:
PostMessage(_hwndTarget, WM_USER + 8888, Key, GetActiveWindow);                    

Mein Problem eins ist, das ich nicht wirklich weiß wie ich den Parameter _hwndTarget deklarieren soll, bzw. was ich genau da rein schreiben muss, da man mir nur gesagt hatte, das ich das Application.handle im Create des Servers in die Registry oder in ein MemoryMapped File schreiben soll. Aber für wie genau soll ich das machen? ich weiß zwar wie ich werte in die Registry schreibe bzw. auslese, aber soll ich einfach das applicaiton.handel der projekt1.exe irgendwo in die registry unter hookapphandle = applicaiton.handle schreiben? und dieses dann in der dll _hwndTarget zuweisen?

Wäre für Hilfe sehr dankbar!
Greetz Torben


BenBE - So 14.02.10 18:31

Andere Möglichkeit:
RegisterWindowMessage nutzen, um zwischen Client und Server eine eindeutige Window-Message auszumachen.
Nach der Installation sendet die Hook-DLL eine Broadcast-Message mit der registrierten Message-ID zur Hauptanwendung zurück.

In der Nachricht können dann 8 Byte Daten übermittelt werden (z.B. ein Fenster wo der Hook auf Nachrichten wartet oder andere Daten).


Astat - Mo 15.02.10 00:20

Hallo T.E, die Welt ist klein "g"


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
uses
  Registry;

//-- In der Dll zum ermitteln von _hwndTarget
function GetHandle(HKEY: DWORD; const SubKey, ValueName: String;
  CanCreate: Boolean = false): DWORD;
var
  Reg : TRegistry;
begin
  result := DWORD(-1);
  Reg:=TRegistry.create;
  Reg.RootKey:=HKey;
  if Reg.OpenKey(SubKey,CanCreate) then
    if Reg.ValueExists(ValueName) then
      result := Reg.ReadInteger(ValueName);
  Reg.CloseKey;
  Reg.Free;
end;

//-- In der Applikation von wo aus Du den Hook startest
procedure AddHandle(HKEY: DWORD; const SubKey, ValueName: String; dwVal: DWORD;
  CanCreate: Boolean = true);
var
  Reg: TRegistry;
begin
  Reg:=TRegistry.Create;
  Reg.RootKey:=HKey;
  if Reg.OpenKey(SubKey, CanCreate) then
    Reg.WriteInteger(ValueName, dwVal);
  Reg.CloseKey;
  Reg.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AddHandle(HKEY_LOCAL_MACHINE, 'SOFTWARE''hwndTarget', Application.Handle);
end;

end.


lg. Astat


Hobby-Programmierer - Mo 15.02.10 13:20

Hallo Astat ...
Würde sich da net - die mal von dir erwähnte - Atomtabelle anbieten?
Auch könnte ich schwören dass ich mal Code gesehen habe wo das Application.Handle der Dll direkt übergeben wurde, als Parameter über eine Procedure die den Hook in der Dll startet?

LG aus Berg am Laim :o)

TE: Ich pers. finde es doof das der Thread zerissen wurde! Hinweis auf Crossposting wäre angebracht gewesen.


Astat - Mo 15.02.10 14:21

Hallo Hobby-Programmierer,

user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
...
Würde sich da net - die mal von dir erwähnte - Atomtabelle anbieten?


Nein, ist ja nur ein Flag ohne hinterlegtem Wert.


user profile iconHobby-Programmierer hat folgendes geschrieben Zum zitierten Posting springen:
Auch könnte ich schwören dass ich mal Code gesehen habe wo das Application.Handle der Dll direkt übergeben wurde, als Parameter über eine Procedure die den Hook in der Dll startet?


Ja, kann man ja implementieren, die Startproc des Hooks mit einem zusätzlichen Parameter versehen,
wenn dieser <> 0 dann Handle in Registry eintragen, wenn = 0 dann nichts eintragen.

Normalerweise verwendet man da eleganterweiese sowieso Memory mapping.

lg. Astat