Ну первое что пришло на ум это ловушка...
Создаешь dll приложение, и пишешь:
	Код:
	library hook;
uses
  Windows, Messages, SysUtils;
var
  SysHook: HHook = 0;
function SysMsgHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT stdcall;
var
 Text: String;
begin
  if (Code = HC_ACTION) and
     (wParam = WM_LBUTTONDOWN) then
  begin
   Text := Format('X: %d, Y: %d', [TMouseHookStruct(Pointer(lParam)^).pt.X,
                                   TMouseHookStruct(Pointer(lParam)^).pt.Y]);
   {
    каким либо образом выводишь эту строку
   }
  end;
 Result := CallNextHookEx(SysHook, Code, wParam, lParam);
end;
procedure RunHook() export; stdcall;
begin
 SysHook := SetWindowsHookEx(WH_MOUSE, @SysMsgHook, HInstance, 0);
end;
procedure StopHook() export; stdcall;
begin
 UnhookWindowsHookEx(SysHook);
end;
exports RunHook index 1;
exports StopHook index 2;
begin
end. 
 
В самой программе поле строчки
пишешь
	Код:
	procedure RunHook() stdcall; external 'hook.dll';
procedure StopHook() stdcall; external 'hook.dll';
 
 
Далее активируешь ловушку
	Код:
	procedure TForm1.FormCreate(Sender: TObject);
begin
 RunHook();
end;
 
 
И уничтожешь
	Код:
	procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 StopHook();
end;
 
 
Чесно говорю, сам не тестил, но должно работать 
