function IsExist(wnd:HWND;ht:HWNDType):Boolean;stdcall; begin if ht = htWeb then Result := WebHash.IndexOf(IntToStr(wnd)) <> -1 else Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1; Result := True; end; function CallWndProcHookCallback(code:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT stdcall; var Cwp:TCWPSTRUCT; DstWnd:HWND; CopyDS:COPYDATASTRUCT; IsSend:Boolean; begin IsSend := False; if code >= 0 then begin Cwp := TCWPSTRUCT(PCWPSTRUCT(lparam)^); case Cwp.message of WM_KILLFOCUS,WM_SETFOCUS,WM_WINDOWPOSCHANGED,WM_DESTROY: if IsExist(Cwp.hwnd,htIEC) then //如果有写这句一运行就退出delphi,如果去掉就可以运行 SendMessage(DestWnd,Cwp.message,0,0); end; end;
WebHash,IECWndHash 什麼時候建立的?
dll最好不用用string类型。比如: “ if ht = htWeb then Result := WebHash.IndexOf(IntToStr(wnd)) <> -1 else Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1; Result := True; ”
在安装hook时创建的 if HInstance = 0 then begin Result := False; Exit; end; FLock := TCriticalSection.Create; WebHash := THashedStringList.Create; IECWndHash := THashedStringList.Create; DestWnd := Wnd; hookCallWndProc := SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProcHookCallback,HInstance,threadID); Result := hookCallWndProc <> 0;
begin
if ht = htWeb then
Result := WebHash.IndexOf(IntToStr(wnd)) <> -1
else
Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1;
Result := True;
end;
function CallWndProcHookCallback(code:Integer;wparam:WPARAM;lparam:LPARAM):LRESULT stdcall;
var
Cwp:TCWPSTRUCT;
DstWnd:HWND;
CopyDS:COPYDATASTRUCT;
IsSend:Boolean;
begin
IsSend := False;
if code >= 0 then
begin
Cwp := TCWPSTRUCT(PCWPSTRUCT(lparam)^);
case Cwp.message of
WM_KILLFOCUS,WM_SETFOCUS,WM_WINDOWPOSCHANGED,WM_DESTROY:
if IsExist(Cwp.hwnd,htIEC) then //如果有写这句一运行就退出delphi,如果去掉就可以运行
SendMessage(DestWnd,Cwp.message,0,0);
end;
end;
“
if ht = htWeb then
Result := WebHash.IndexOf(IntToStr(wnd)) <> -1
else
Result := IECWndHash.IndexOf(IntToStr(wnd)) <> -1;
Result := True;
”
在安装hook时创建的
if HInstance = 0 then
begin
Result := False;
Exit;
end;
FLock := TCriticalSection.Create;
WebHash := THashedStringList.Create;
IECWndHash := THashedStringList.Create;
DestWnd := Wnd;
hookCallWndProc := SetWindowsHookEx(WH_CALLWNDPROC,@CallWndProcHookCallback,HInstance,threadID);
Result := hookCallWndProc <> 0;