delphi HooK 指定程序窗体和控件的 WndProc


本文整理自网络,侵删。

 搞点界面XX

只是做不好的话会引起explorer和其他程序崩溃

首先我们的思路肯定这样的啦!

1 下钩

2 当一个程序运行后钩子被注入,入口肯定是要先判断 是否是我们要HOOK的程序的进程

3判断是了就保存原来的WndProc的地址然后 SetWindowLong 把窗体的 WndProc 或 控件的 WndProc 转向我们新的 WndProc



然后呢,发现什么问题,钩子入口函数执行啦,但是 SetWindowLong 就是不成功。。。(SetWindowLong 头参是窗体或控件句柄)

调了下,发现原来 SetWindowLong 函数没有被执行,纳闷中 ,以为入口函数没有被执行 ,后来放个消息发现 入口函数被执行,但是

SetWindowLong 没有被执行........

原来当钩子入口函数执行的时候 钩子所在进程是有啦 ,但是进程的窗体还没出来,获取不到窗体句柄和控件句柄.

后来把 SetWindowLong 尝试放在其他位置 , 发现挂钩总是过滤不到消息不然就是引起其他程序崩溃..........

下楼完吃饭 , 找到突破口 , 尝试了下 , 好啦.

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

钩任务管理器的 WndProc 为例子...............

HOOK控件WndProc的话,需要先枚举出你要搞的那个的句柄,然后就不用说了吧,枚举自己来,我这里不搞了.

ibrary zhusjm;

uses
Windows, Messages, SysUtils, Dialogs, psapi;

var
OldHook: HHOOK;
OldProc:FARPROC;
CriticalSection: TRTLCriticalSection;

Function WndProc(Hwnd,Msg,wParam,lParam:longint):LRESULT; stdcall;
begin
case Msg of
//WM_PAINT: 这东西好啊 = = ,搞点什么好事都不错丫,嘻嘻嘻
WM_MOUSEMOVE:
begin
showmessage('s');
end;
end;
Result:=CallWindowProc(OldProc,Hwnd,Msg,wParam,lParam);
end;


procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
var
Winh:HWND;
begin
CallNextHookEx(OldHook, nCode, wParam, lParam);
end;


function SetHook:Boolean;stdcall;
begin
OldHook:=SetWindowsHookEx(WH_GETMESSAGE,@HookProc, Hinstance,0);
if (OldHook=0) then
begin
exit
end
else
Result:=True;
end;


procedure UnHook; stdcall;
begin
UnhookWindowsHookEx(OldHook);
end;


function IdToExeDir(dwProcessId : DWORD): String;
var
cbNeeded : DWORD;
hProcess : THandle;
hModules : HMODULE;
lpFilename : array [0..1024-1] of Char;
begin
result:='';
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,false,dwProcessId);
if hProcess=0 then exit;
EnumProcessModules(hProcess,@hModules,sizeof(hModule),cbNeeded);
GetModuleFileNameEx(hProcess,hModules,lpFilename,1024);
result:=lpFilename;
CloseHandle(hProcess);
end;


procedure SetWndProc;
var
WinStr:HWND;
begin
EnterCriticalSection(CriticalSection);
Sleep(2000); //等两秒,嘿嘿 这回窗口出来了吧~
WinStr:=FindWindow(nil,'Windows 任务管理器');
OldProc:=FARPROC(GetWindowLong(WinStr,GWL_WNDPROC));
if WinStr<>0 then
begin
SetWindowLong(WinStr,GWL_WNDPROC,Longint(@WndProc));
end;
LeaveCriticalSection(CriticalSection);
ExitThread(4);
end;


procedure FindWindows;
var
WinStr:HWND;
ThreadId1:DWORD;
begin
if pos('taskmgr',IdToExeDir(GetCurrentProcessID))>0 then
begin
if CriticalSection.RecursionCount<>0 then
DeleteCriticalSection(CriticalSection);
InitializeCriticalSection(CriticalSection);
CreateThread(nil,0,@SetWndProc,nil,0,ThreadId1); //虽然这时候窗口没出来find不到句柄,那我们不懂来个线程啊,嘻嘻嘻嘻
end;
end;


procedure DllMain(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
FindWindows;
end;
DLL_PROCESS_DETACH:
begin

end;
end;
end;

exports
SetHook,
UnHook;

begin
DLLProc:=@DllMain;
DllMain(DLL_PROCESS_ATTACH);
end.

 

相关阅读 >>

Delphi 取得某一天所在的星期一及星期天

Delphi之autorun(复制自身+循环扫描)

Delphi 如何确定windows安装的语言

Delphi firemonkey移动应用程序将设置保存到ini文件的示例

Delphi隐藏进程

Delphi 字符串中末位是双字节字符的处理(避免最后一位为乱码)

Delphi 获取指定当前目录下指定文件扩展名所有文件

Delphi复制文件夹内所有文件

Delphi 把一个ico转换为bmp

Delphi tdsauthenticationmanager的用法

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...