library HOOK;uses
SysUtils,
windows,
Messages;var
DLLHook: HHOOK;
Bol: Boolean = False;
processhandle:Thandle;
BaseAddress: Pointer;function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var
pcs:TMSG;
H:HWND;
begin
pcs:=TMSG(PMSG(lParam)^);
if nCode>=0 then
begin
if pcs.message=wm_SHOWWINDOW then
h:= FindWindow(nil,'ApiHook.pas - 记事本');
h:= FindWindowEx(h,0,'edit',nil);
SendMessage(h,WM_SETTEXT,255,Integer(PChar('全局钩子')));
end;
Result:=CallNextHookEx(0,nCode,wParam,lParam);
end;{ 状态挂钩 }
function InstallHook(MainHandle: HWND): Boolean; stdcall;
begin
DLLHook := SetWindowsHookEx(WH_CALLWNDPROC, @GETMSGProc, Hinstance, 0);
Result := DLLHook <> 0;
end;
procedure inhook;stdcall;
var
DLLModule: THandle;
begin
ProcessHandle := GetCurrentProcess;
DLLModule := LoadLibrary('kernel32.dll');
{ 系统函数入口点地址 }
BaseAddress := GetProcAddress(DLLModule, 'GetMsgProc');
INSTALLHOOK(PROCESSHANDLE);end;
{ 卸载挂钩 }
procedure UnHook; stdcall;
begin
UnhookWindowsHookEx(DLLHook);
//其实这里压根就没用...
end;procedure MyDLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: inhook;
DLL_PROCESS_DETACH: UnHook;
end;
end;
SysUtils,
windows,
Messages;var
DLLHook: HHOOK;
Bol: Boolean = False;
processhandle:Thandle;
BaseAddress: Pointer;function GetMsgProc(nCode:integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
var
pcs:TMSG;
H:HWND;
begin
pcs:=TMSG(PMSG(lParam)^);
if nCode>=0 then
begin
if pcs.message=wm_SHOWWINDOW then
h:= FindWindow(nil,'ApiHook.pas - 记事本');
h:= FindWindowEx(h,0,'edit',nil);
SendMessage(h,WM_SETTEXT,255,Integer(PChar('全局钩子')));
end;
Result:=CallNextHookEx(0,nCode,wParam,lParam);
end;{ 状态挂钩 }
function InstallHook(MainHandle: HWND): Boolean; stdcall;
begin
DLLHook := SetWindowsHookEx(WH_CALLWNDPROC, @GETMSGProc, Hinstance, 0);
Result := DLLHook <> 0;
end;
procedure inhook;stdcall;
var
DLLModule: THandle;
begin
ProcessHandle := GetCurrentProcess;
DLLModule := LoadLibrary('kernel32.dll');
{ 系统函数入口点地址 }
BaseAddress := GetProcAddress(DLLModule, 'GetMsgProc');
INSTALLHOOK(PROCESSHANDLE);end;
{ 卸载挂钩 }
procedure UnHook; stdcall;
begin
UnhookWindowsHookEx(DLLHook);
//其实这里压根就没用...
end;procedure MyDLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: inhook;
DLL_PROCESS_DETACH: UnHook;
end;
end;
解决方案 »
- 往ListView里面添加数据的问题
- 我现在实现了能拖放文件到listview,并且当拖放完成时,能获取当前鼠标下的item,可问题是当鼠标拖拽着文件浮动于listview上时,我希望它
- 从excel中查询插入到access中出错,解决就结贴
- 有没有高手?看看这个简单问题:
- 数据变化时事件触发问题
- double 类型问题 帮个小忙 分不够在加 保证有答案就结帐
- 在D6下有source目录,里面的是不是例子,怎用?
- 如何在win2000或win98下修改计算机名?
- DBGridEh1.Columns.State := csDefault;中为何编译出错?
- 关于treeview点击节点前‘+’时,节点图标变化的问题?
- 信息安全公司 招C 熟手 (起薪6K,不封顶)
- 利用delphi6自带报表控件如何实现不分页连续打印?
你必须在目标进程的进程空间内完成卸载操作.而你写的unhook是在自己的进程空间中了,所以没有用.
LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
MSG *msg = (MSG *)lParam;
if (msg->message == WM_CHAR) {
if (msg->wParam == 'h') HookApi(); // !!!
if (msg->wParam == 'u') UnHookApi(); // !!!
}
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
}
代码出自这篇文章 :[跨进程hook api].建议你看看
http://www.qqread.com/vc/j258283.html