interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMsgReceiver = class(TObject)
private
fMsgHandlerHWND : HWND;
WM_MY_UNIQUE_MESSAGE : Cardinal;
procedure WndMethod(var Msg: TMessage);
public
Point : TPoint;
constructor Create;
destructor Destroy; override;
end;
TClickSendForm = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure FormDestroy(Sender: TObject);
private
WM_MY_UNIQUE_MESSAGE : Cardinal;
fMsgReceiver: TMsgReceiver;
function GetMsgReceiver: TMsgReceiver;
property MsgReceiver : TMsgReceiver read GetMsgReceiver;
public
{ Public declarations }
end;
var
ClickSendForm: TClickSendForm;
implementation
{$R *.dfm}
procedure TClickSendForm.FormCreate(Sender: TObject);
begin
//instantiate MsgReceiver
MsgReceiver;
WM_MY_UNIQUE_MESSAGE := RegisterWindowMessage('MSG_MY_UNIQUE_MESSAGE');
end;
{ TMsgReceiver }
constructor TMsgReceiver.Create;
begin
inherited Create;
fMsgHandlerHWND := AllocateHWnd(WndMethod);
WM_MY_UNIQUE_MESSAGE := RegisterWindowMessage('MSG_MY_UNIQUE_MESSAGE');
end;
destructor TMsgReceiver.Destroy;
begin
DeallocateHWnd(fMsgHandlerHWND);
inherited;
end;
procedure TMsgReceiver.WndMethod(var Msg: TMessage);
begin
if Msg.Msg = WM_MY_UNIQUE_MESSAGE then
begin
Point.X := Msg.LParam;
Point.Y := Msg.WParam;
//just to receive some "output"
Windows.Beep(Point.X, Point.Y);
end
else
Msg.Result := DefWindowProc(fMsgHandlerHWND, Msg.Msg, Msg.wParam, Msg.lParam);
end;
procedure TClickSendForm.FormDestroy(Sender: TObject);
begin
FreeAndNil(fMsgReceiver);
end;
procedure TClickSendForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PostMessage(HWND_BROADCAST, WM_MY_UNIQUE_MESSAGE, x, y);
end;
function TClickSendForm.GetMsgReceiver: TMsgReceiver;
begin
if fMsgReceiver = nil then fMsgReceiver := TMsgReceiver.Create;
result := fMsgReceiver;
end;
end.