[Delphi] CBTHook programmieren

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... :confused_alt:

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:
Zurück
Oben