如何用同一个DLL注入到同一进程的不同窗口中
我想用子类化监视另一进程的几个窗口的消息,网上找的那篇跨进程子类化的方法只能注入一次,我想用一个DLL就把窗口都注入了,怎么做啊?
我自己改了下,连注入都不会了,不知道怎么回事
以前在网上找的要用到全局的共享变量,我不想用那个就改了下怎么完全不能用了啊,DLL都没注入进去,难道非要用那个全局共享变量才行吗
library Hook;
uses
windows, Messages; //SysUtils,
const
HOOK_EVENT_NAME = 'MyHook';
WM_MYCPSHOWWINDOW=WM_USER+600;
var
OldWndProc: pointer; {旧的窗口过程}
HookWindow, SpyWindow: LongWORD; {要安装HOOK的窗口及用于接收消息的窗口}
hHook: LongWORD; {HOOK句柄}
{----------}
{函数名:NewWndProc
{函数功能:新的窗口过程
{函数参数:hHwnd:窗口句柄 Msg:消息ID
{ wParam, lParam:消息参数
{函数返回值:下一个窗口过程的返回值
{----------}
function NewWndProc(hHwnd, Msg, wParam, lParam: LongWORD): Longint; stdcall;
begin
{给监视窗口发送拦载新消息的消息}
if (Msg=WM_SHOWWINDOW) then begin
SendMessage(SpyWindow,WM_MYCPSHOWWINDOW,wParam, lParam);
end;
Result := CallWindowProc(OldWndProc, hHwnd, Msg, wParam, lParam);
end;
{----------}
{过程名:HookProc
{过程功能:HOOK过程
{过程参数:nCode, wParam, lParam消息的相{关参数{----------}
procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
var
hEvent: THandle;
begin
{保存窗口过程地址并子类化}
if hEvent <> 0 then
begin
WaitForSingleObject(hEvent, INFINITE);
CloseHandle(hEvent);
end;
OldWndProc := pointer(GetWindowLong(HookWindow, GWL_WNDPROC));
SetWindowLong(HookWindow, GWL_WNDPROC, integer(@NewWndProc));
hEvent := OpenEvent(Synchronize, False, HOOK_EVENT_NAME);
{调用下一个Hook}
CallNextHookEx(hHook, nCode, wParam, lParam);
end;
{----------}
{函数名:InstallHook
{函数功能:在指定窗口上安装HOOK
{函数参数:HWindow:要安装HOOK的窗口
{ SWindow:用于接收消息的窗口
{返回值:成功返回TRUE,失败返回FALSE
{----------}
function InstallHook(HWindow, SWindow: LongWORD):Boolean;stdcall;
var
ThreadID: LongWORD;
hEvent: THandle;
begin
Result := False;
hHook := 0;
HookWindow := HWindow;
SpyWindow := SWindow;
{得到指定窗口的线程ID}
ThreadID := GetWindowThreadProcessId(HWindow, nil);
{给指定窗口挂上钩子}
hEvent := CreateEvent(nil, True, False, HOOK_EVENT_NAME);
hHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, ThreadID);
SetEvent(hEvent);
CloseHandle(hEvent);
if hHook > 0 then Result := True; {是否成功HOOK}
end;
{----------}
{过程名:UnHook
{过程功能:卸载HOOK
{过程参数:无
{----------}
procedure UnHook;stdcall;
begin
{发送卸载子类化消息给指定窗口}
{卸载Hook}
UnhookWindowsHookEx(hHook);
end;
{----------}
{过程名:DLL入口函数
{过程功能:进行DLL初始化,释放等
{过程参数:DLL状态
{----------}
procedure MyDLLHandler(Reason: Integer);
var
FHandle: LongWORD;
begin
case Reason of
DLL_PROCESS_ATTACH:;
DLL_PROCESS_DETACH:;
DLL_THREAD_ATTACH:;
DLL_THREAD_DETACH:;
end;
end;
exports
InstallHook, UnHook, HookProc;
begin
DLLProc := @MyDLLHandler;
MyDLLhandler(DLL_PROCESS_ATTACH);
end.