| Autor |
Beitrag |
T.E.
      
Beiträge: 31
Win RT, Win 7 Pro, Win 8 Pro
Delphi 2009 Enterprise, Delphi XE, Delphi XE2
|
Verfasst: So 14.02.10 15:12
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
_________________ Schöne Grüße,
Torben
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Mo 15.02.10 00:20
Hallo T.E, die Welt ist klein "g"
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;
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;
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
      
Beiträge: 238
Erhaltene Danke: 4
Win XP Pro, Vista Ultimate Trial :o)
D6 Pro, D7 Pro, Turbo, XE SE
|
Verfasst: 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  )
TE: Ich pers. finde es doof das der Thread zerissen wurde! Hinweis auf Crossposting wäre angebracht gewesen.
|
|
Astat
      
Beiträge: 75
Erhaltene Danke: 1
Windows 2000
D6, D7, D2007, Lazarus
|
Verfasst: Mo 15.02.10 14:21
Hallo Hobby-Programmierer,
Hobby-Programmierer hat folgendes geschrieben : | ...
Würde sich da net - die mal von dir erwähnte - Atomtabelle anbieten?
|
Nein, ist ja nur ein Flag ohne hinterlegtem Wert.
Hobby-Programmierer hat folgendes geschrieben : | 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
|
|
|