procedure HandleEvent(HLib:THandle); stdcall; var Msg: TMsg; MutexHandle:THandle; begin //再检查一次全局原子,如果该原是存在,则退出本函数,线程中止. MutexHandle := windows.GlobalFindAtom('abhjjhsdhjdshjds111'); if MutexHandle <> 0 then Exit; MutexHandle:=Windows.GlobalAddAtom('abhjjhsdhjdshjds111'); //添加一个全局原子. try //创建一个Form. Form2:=TForm2.Create(nil); try Form2.Show; //显示Form.
//消息循环. while True do begin //如果Form已经被关闭. //注意这是和Form.OnClose事件和Form.OnDestroy事件配合使用的. if Form2=nil then Break; //检查消息队列. if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin //如果得到WM_QUIT消息,则中止循环. if Msg.Message = WM_QUIT then Break; //分发消息. TranslateMessage(Msg); DispatchMessage(Msg); end; end; finally //如果Form2还没有被释放. if Form2<>nil then Form2.Free; end; finally //释放全局原子对象. Windows.GlobalDeleteAtom(MutexHandle); end; end;
Procedure CreateImmitThread; stdcall; var ThreadID:DWORD; begin //该函唯一的功能就是创建并启动一个线程. CreateThread(nil, 0, @HandleEvent, nil, 0, ThreadID); end;
function MouseHookProc(nCode: Integer;WParam: WPARAM;LParam:LPARAM): LRESULT;stdcall; var a:Array[0..255] of char; s:String; H:THandle; P:Pointer; MutexHandle:THandle; begin Result:=0;//最好首先给它一个返回值,不然会有警告的!记住这可不是C语言。 //当nCode小于0时表示还有其它的Hook 必须把参数传给它。 //此时就要用Api函数CallNextHookEx让它调用下一个Hook!!!当然不用好像也可以。 if nCode < 0 then Result:=CallNextHookEx(hHk,nCode,wParam,lParam)//参数是现成的,直接用就可以了。 else begin GetModuleFileName(0,a,255); s:=UpperCase(StrPas(a)); if Pos('EXPLORER.EXE',s)>0 then//如果是资源管理器Explorer.EXE. begin MutexHandle := windows.GlobalFindAtom('abhjjhsdhjdshjds111');//检查是不存在全局原子 if MutexHandle <> 0 then//如果存在,则表示该窗口已经显示出来了. exit; H:=LoadLibrary('HookDLL.dll');//装载需要注入的DLL,其实就是本DLL. if H<>INVALID_HANDLE_VALUE then begin P:=GetProcAddress(H,'CreateImmitThread');//得到注入的函数地址. if P<>nil then TCreateImmitThread(P);//执行函数,该函数仅启动一个线程. end; end; end; end;
function EnableMouseHook:Boolean; stdcall; export; begin if hHk = 0 then //为了安全,必须判断一下再设置钩子。 Begin //第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0 hHk := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0); Result := True; end else Result := False; end;
function DisableMouseHook:Boolean; stdcall; export; begin if hHk <> 0 then //如果有钩子就卸掉它。 begin UnHookWindowsHookEx(hHk); hHk := 0; Result := True; end else Result := False; end; end.