我想通过钩子(HCBT_CREATEWND)来勾住正在启动的程序,达到禁止程序运行的目的.
程序一开始运行时,是可以勾住的,可如果机子运行久了之后或打开很多程序的时候(即如果CPU过高之后),钩子会失效.[:(]
请各位高手帮帮忙,看看怎么回事,下面是我的钩子Dll代码,作用是传递一个程序启动的进程ID给主界面:
unit Unit1;
interface
uses
    windows,
    messages,
    Classes,
    sysutils;type    PServerData = ^ServerData;
    ServerData = record
        Wnd: HWND;
        UniqueMsgID: Cardinal;
        hHk: HHOOK;
    end;var
    hThisHook: HHOOK;
    SData: PServerData;
    MapServerHandle: THandle;
    procExit: pointer;
const    cMMServerData: PChar = 'ServerMapData';procedure HookExit; far;
procedure OpenShareData();
procedure CloseShareData();
function EnableHook(h: HWND): Boolean; stdcall;
function DisableHook(): Boolean; stdcall;
function CBTHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult; stdcallimplementationprocedure HookExit;
begin
    if hThisHook <> 0 then
        DisableHook();
    ExitProc := procExit;
end;procedure OpenShareData();
var
    Size: integer;
begin
    Size := Sizeof(SData);
    MapServerHandle := CreateFileMapping(DWORD(-1), nil, PAGE_READWRITE, 0, Size,
        cMMServerData);
    SData := MapViewOfFile(MapServerHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
end;procedure CloseShareData();
begin
    UnmapViewOfFile(SData);
    CloseHandle(MapServerHandle);
end;function EnableHook(h: HWND): Boolean; stdcall;
begin
    if SData.hHk <> 0 then begin
        Result := false;
        exit;
    end;
    SData.Wnd := h;
    SData.UniqueMsgID := RegisterWindowMessage('KillThread');
    SData.hHk := SetWindowsHookEx(WH_CBT, @CBTHookProc, HInstance, 0);
    Result := SData.hHk <> 0;
end;function CBTHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LResult;
var
    Pid: DWORD;
begin    if nCode < 0 then begin
        Result := CallNextHookEx(SData.hHk, nCode, wParam, lParam);
        exit;
    end;
    if nCode = {HSHELL_WINDOWCREATED} HCBT_CREATEWND then begin
        GetwindowThreadprocessid(wParam, @Pid);
            SendMessage(Sdata.Wnd, SData.UniqueMsgID, wParam, pid);
        TempProcessID := Pid;
        Result := CallNextHookEx(SData.hHk, nCode, wParam, lParam);
    end
    else
        Result := CallNextHookEx(SData.hHk, nCode, wParam, lParam);
end;function DisableHook(): Boolean; stdcall;
begin
    Result := false;
    if UnhookWindowsHookEx(SData.hHk) then begin
        SData.hHk := 0;
        Result := true;
    end;end;end.