Сам сейчас с этим запариваюсь.
Вот в сокращенном варианте:
function CBTProc(code : integer; wParam : word; lParam : longint) : longint; export; stdcall;
begin
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
if Code < 0 then Exit;
case Code of
HCBT_ACTIVATE:
begin
end;
HCBT_CREATEWND:
begin
end;
HCBT_DESTROYWND:
begin
end;
end; // case Code
end;
function SetHook(UseProtect, LogCreate, LogActivate, LogDestroy: Boolean) : Boolean; export; stdcall;
begin
SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0);
end;
function StopHook: Boolean; export; stdcall;
begin
UnhookWindowsHookEx(SysHook);
end;