我想通过钩子(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.
程序一开始运行时,是可以勾住的,可如果机子运行久了之后或打开很多程序的时候(即如果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.
解决方案 »
- delphi Webbrowser控件 复制与粘贴问题
- 从Tclientdataset中获取数据的问题
- 请问我在dll中使用了spcomm控件,现在是如何在dll中spcomm的WriteCommData方法里写代码,以及如何在onReceiveData事件中写代码?
- 特急呀! 为什么调用DLL会出现“灾难性故障”,就是ClientDataSet.data=NewData出错。
- 请教大家我要显示表格样式的,用什么VCL好呢?StringGird?
- 请问有控件可以实现区域选择吗?
- 多个表同时输入出错控制
- ListView中的这个特征如何实现
- 有没有面向DELPHI开发者的WINDOWS API方面的书???新年快乐哈!!!
- 送软件,切磋技艺
- singletonfrm(单独模式)的代码看不明白的地方请教,谢谢
- 为什么会出现应用程序初始化(0xc000007b)失败
http://search.csdn.net/Expert/topic/588/588700.xml?temp=.4101831