library R;

 

{$R *.res}


procedure SetDllSkin(Handle: HWnd;AData: Pointer);
begin
  Application.Handle := Handle;
  Winskindata.SkinDll(AData);
end;

 

var
  DllApp: TApplication;
  hhk: HHOOK;
  FMouseControl: TControl;

function DoMouse: TControl;
var
  CaptureControl: TControl;
  P: TPoint;
begin
  GetCursorPos(P);
  Result := FindDragTarget(P, True);
  if (Result <> nil) and (csDesigning in Result.ComponentState) then
    Result := nil;
  CaptureControl := GetCaptureControl;
  if FMouseControl <> Result then
  begin
    if ((FMouseControl <> nil) and (CaptureControl = nil)) or
      ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
      FMouseControl.Perform(CM_MOUSELEAVE, 0, 0);
    FMouseControl := Result;
    if ((FMouseControl <> nil) and (CaptureControl = nil)) or
      ((CaptureControl <> nil) and (FMouseControl = CaptureControl)) then
      FMouseControl.Perform(CM_MOUSEENTER, 0, 0);
  end;
end;

function MouseProc(nCode: Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
begin
  if (nCode=HC_ACTION) and (wParam=WM_MOUSEMOVE) then
  begin
    DoMouse;
  end;
  Result := CallNextHookEx(hhk,nCode,wParam,lParam);
end;

procedure HookOn;
begin
  hhk := SetWindowsHookEx(WH_MOUSE,@MouseProc,HInstance,GetCurrentThreadId);
end;

procedure HookOff;
begin
  UnhookWindowsHookEx(hhk);
end;

procedure DllMain(Reason:integer);
begin
  if Reason=DLL_PROCESS_ATTACH then
  begin
    HookOn;
  end else
  if Reason=DLL_PROCESS_DETACH then
  begin
    Application:=DLLApp;//恢复
    HookOff;
  end;
end; 

begin
  DllApp := Application;
  DllProc := @DllMain;
  DllMain(DLL_PROCESS_ATTACH);
end.

posted on 2010-08-25 16:30  ABC8MS  阅读(382)  评论(0编辑  收藏  举报