А об Mouse Capture никто не слышал ?
Вот пример работы:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
FPressed : Boolean;
FPreviousCapture : HWND;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FPressed := True;
FPreviousCapture := SetCapture (Button1.Handle); { контрол будет получать сообщения от мышки, даже если она не над ним }
{ тут можна стартануть таймер, чтобы тикало }
end;
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FPressed then
{ button pressed обрабатывай передвижение мышки};
end;
procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FPressed then begin
{ Mouse up придет даже если мышка не над контролом, потому что мы держим capture }
FPressed := False;
SetCapture (FPreviousCapture);
end;
end;
end.