unit uDllWindowsHook;
interface
uses
Windows, Messages, SysUtils, Dialogs;
const
IPCExitMSG = '
Exit';
function Start(Host, TB, Client: HWND): Boolean;
stdcall;
function GetTBHandle: HWND;
function GetClientWnd: HWND;
procedure Stop;
stdcall;
procedure UnSubClassTBWndProc(hWnd: HWND);
procedure IPCSendMessage(Client: HWND; Msg: PChar);
implementation
//Globale Var
var
HookingFlag : Boolean = false;
//Ist True fall der Hook erfolgreich ausgeführt wurde
TBSubclassed: Boolean = false;
HookHandle : HHOOK = 0;
//Handle zur Hook hProcedure welche die Messages verarbeitet
HostWnd : HWND = 0;
//Fenster Handle vom Module(DLL
OldTBWndProc: Pointer =
nil;
//Adresse der Orginalen Toolbar32 Fensterprozedure der Taskbar des Explorers
Tb32hWnd : HWND = 0;
//Handle der Toolbar32 der Taskbar
ClientWnd : HWND = 0;
//Fensterhandle des Clients
procedure IPCSendMessage(Client: HWND; Msg: PChar);
var
aCopyData: TCopyDataStruct;
begin
with aCopyData
do begin
dwData := 0;
cbData := StrLen(Msg) + 1;
lpData := Msg;
end;
SendMessage(Client, WM_COPYDATA, Longint(HostWnd), Longint(@aCopyData));
Msg := '
';
end;
function GetTBHandle: HWND;
begin
Result := Tb32hWnd;
end;
function GetClientWnd: HWND;
begin
Result := ClientWnd;
end;
function NewTBWndProc(hWnd: HWND; Msg: WORD; wParam: WORD; lParam: LONGINT):LONGINT;
type
PNMHDR = ^NMHDR;
//FIXME: Ich hoffe die def. ist in ordnung
var
MessageProcessed: Boolean;
buff :
array[0..512]
of Char;
myNMHDR : PNMHDR;
//NMHDR ist die datenstruktur welche aus der WM_NOTIFY Nachricht die gewünschten Informationen enthält
begin
MessageProcessed := False;
IPCSendMessage(ClientWnd, '
Eine Nachricht angekommen');
case Msg
of
WM_NOTIFY :
begin
myNMHDR := PNMHDR(lParam);
//FIXME: Hoffe der Typcast ist in ordnung
wsprintf(buff, PChar(myNMHDR.idFrom));
//pNMHDR.idFrom beinhaltet nun die ID des Toolbar32 buttons der Taskbar des Explorers
//Nun client den Client die TB Button ID via IPC(SendMessage) senden
IPCSendMessage(ClientWnd, buff);
ShowMessage('
INDEX: ' + buff);
MessageProcessed := true;
end;
end;
if not MessageProcessed
then
Result := CallWindowProc(Pointer(OldTBWndProc), hWnd, Msg, wParam, lParam)
else
Result := 0;
end;
procedure SubClassTBWndProc(hWnd: HWND);
begin
OldTBWndProc := Pointer(GetWindowLong(hWnd, GWL_WNDPROC));
SetWindowLong(hWnd, GWL_WNDPROC, Integer(@NewTBWndProc));
TBSubclassed := True;
IPCSendMessage(ClientWnd, '
DLL: erfoglreich gesubclassed');
ShowMessage('
DLL: erfoglreich gesubclassed!!!!!!!');
end;
procedure UnSubClassTBWndProc(hWnd: HWND);
begin
SetWindowLong(hWnd, GWL_WNDPROC, Integer(@OldTBWndProc));
end;
function HookProc(nCode:integer;wParam:Integer;lParam:Integer):Integer;
stdcall;
var
cwps: TCWPStruct;
begin
if (nCode = HC_ACTION)
then
begin
CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT));
if (cwps.hwnd = Tb32hWnd)
then //Ist es unser Toolbar32 Fenster
begin
if (TBSubclassed = false)
then
begin
SubClassTBWndProc(Tb32hWnd);
ShowMessage('
Dll: Erfolgreich injeziert und Hook erfolgreich gestartet und gesubclassed');
IPCSendMessage(ClientWnd, '
Aktiviert');
end;
end;
end;
Result:= CallNextHookEx(HookHandle, nCode, wParam, lParam)
end;
function Start(Host, TB, Client: HWND): Boolean;
stdcall;
var
TID : DWord;
begin
Result :=False;
HostWnd := Host;
//Fenster handle des Modules
Tb32hWnd := TB;
ClientWnd := Client;
TID := GetWindowThreadProcessId(Tb32hWnd,
nil);
if (TID = 0)
then
begin
ShowMessage('
Error TID ist null');
Stop;
FreeLibrary(hinstance);
end
else
begin
HookHandle := SetWindowsHookEx(WH_CALLWNDPROC,
@HookProc,
hInstance,
TID);
end;
if (HookHandle > 0)
then
begin
HookingFlag:=True;
Result:=True;
ShowMessage('
HOOK INSTALLIERT!');
IPCSendMessage(ClientWnd, '
GEstartet');
end;
end;
procedure Stop;
stdcall;
begin
if HookingFlag
then
UnhookWindowsHookEx(HookHandle);
HookHandle := 0;
HostWnd := 0;
Tb32hWnd := 0;
ClientWnd := 0;
HookingFlag := false;
OldTBWndProc :=
nil;
TBSubclassed := false;
ShowMessage('
DLL: Erfolgreich Hook gestoppt');
end;
initialization
begin
HookingFlag:=False;
end;
end.