7H3 N4C3R
Lt. Commander
- Registriert
- Feb. 2002
- Beiträge
- 1.816
CBTHook unter Delphi programmieren
Ich habe versucht, einen CBT Hook zu programmieren, um die Erzeugung von Fenstern systemweit zu überwachen (ohne dabei einen lästigen Timer benutzen zu müssen).
Jedes mal, wenn ich nun versuche, auf die CBTCreateWnd-Struktur zuzugreifen, stürzt Windows total ab. (erst eine Meldung über einen ungültigen Vorgang in der Host-Anwendung oder in der kernel32.dll; danach ist "Sense").
Die WinInfo-Struktur liegt in einem MemoryMappedFile und die Host-Andwendung wird über eine private Message (MessageID von RegisterWindowsMessage) über eine Änderung benachrichtigt. Daran liegt es definitv nicht. Habe es schon ohne Zugriff auf die CBTCreateStruktur probiert, dann funktioniert es...
Was mache ich falsch???
Hier ein Auszug aus der DLL.
P.S.: An der Umwandlung von PChar zu ShortString liegt es nicht, das macht Delphi automatisch.
Ich habe versucht, einen CBT Hook zu programmieren, um die Erzeugung von Fenstern systemweit zu überwachen (ohne dabei einen lästigen Timer benutzen zu müssen).
Jedes mal, wenn ich nun versuche, auf die CBTCreateWnd-Struktur zuzugreifen, stürzt Windows total ab. (erst eine Meldung über einen ungültigen Vorgang in der Host-Anwendung oder in der kernel32.dll; danach ist "Sense").
Die WinInfo-Struktur liegt in einem MemoryMappedFile und die Host-Andwendung wird über eine private Message (MessageID von RegisterWindowsMessage) über eine Änderung benachrichtigt. Daran liegt es definitv nicht. Habe es schon ohne Zugriff auf die CBTCreateStruktur probiert, dann funktioniert es...

Was mache ich falsch???
Hier ein Auszug aus der DLL.
Code:
// Hhk enthält den Handle zum Hook
// MessageID enthält die private MessageID
// HostWnd enthält den Handle zum Fenster, an das die Messages geschickt werden
type
PWinInfo = ^TWinInfo;
TWinInfo = packed record
WndName: ShortString;
WndClass: ShortString;
end;
function CBTProc(nCode: Integer; wPar: WPARAM; lPar: LPARAM): LRESULT; stdcall;
var
P: PCBTCreateWnd;
begin
if nCode < 0 then Result := CallNextHookEx(Hhk, nCode, wPar, lPar) else
begin
Result := 0;
case nCode of
HCBT_CREATEWND:
begin
P := PCBTCreateWnd(lPar);
WinInfo^.WndName := (P^.lpcs)^.lpszName; <-- Absturz genau hier
WinInfo^.WndClass := (P^.lpcs)^.lpszClass;
PostMessage(HostWnd, MessageID, wPar, 0); //lParam=0: Fenster erzeugt
end;
HCBT_DESTROYWND:
PostMessage(HostWnd, MessageID, wPar, 1); //lParam=1: Fenster zerstört
end;
end;
end;
P.S.: An der Umwandlung von PChar zu ShortString liegt es nicht, das macht Delphi automatisch.
Zuletzt bearbeitet: