PDA

Ver la Versión Completa : Detectar clic del ratón en toda la aplicación


zurech
05-02-2007, 18:29:03
Buenas a todos/as.

Os explico mi problema, necesito poder detectar cuando se hace clic en una animación Flash que por supuesto no tiene el evento OnMouseClic.
Por ello he pensado en detectar simplemente cuando hay un clic de ratón (sea donde sea) y entonces obtener las coordenadas del ratón para calcular si hace clic sobre la animación.

La putada es que no se como detectar que se ha hecho clic con el ratón.
He estado probando con el componente JvWindowHook de la Jedi Library, pero no lo consigo hacer funcionar.
También he visto por hay unos comentarios de roman (me parece) donde hace referencia a unas clases hechas por él sobre hooks, pero el enlace ya no funciona.

A ver si alguno/a sabeis como puedo conseguirlo.

Gracias de antemano y me parece que no he repetido ninguna pregunta ya hecha, si lo he hecho sorry.

ArdiIIa
05-02-2007, 18:46:25
Bueno, supongo que la animación Flash, está embebida dentro de tu aplicación, y si es así, supongo que con un simple TApplicationEvents controlando el envento OnMessage y dentro de este procedimiento controlando algo tal como esto, debería ser suficiente.

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);
begin
if Msg.message = WM_LBUTTONUP THEN
ShowMessage('Click');
end;


Si no es así, sería cuestión de controlar la ventana donde está el Flash y controlar los mensajes de esta....

He realizado la prueba de insertar una imagen flash en un form mediante un TShockwaveFlash extraído del OCX correspondiente, y el procedimiento descrito anteriormente funciona correctamente

zurech
05-02-2007, 18:56:46
Muchas gracias ArdiIIa funciona a la perfección.

Para los que, como yo, no sepan que es eso del TApplicationEvents, deciros que es un componente que encontrareis en la barra de componentes dentro del apartado Additional

ArdiIIa
05-02-2007, 19:07:01
Otra alternativa a TApplicationEvents, es desviar en nuestra aplicación el proceso de los mensajes recibidos tal como:


private
FClientInstance : TFarProc;
FPrevClientProc : TFarProc;


procedure TFormMain.FormCreate(Sender: TObject);
begin
FClientInstance := MakeObjectInstance(ClientWndProc);
FPrevClientProc := Pointer(GetWindowLong(ClientHandle,GWL_WNDPROC));
SetWindowLong(ClientHandle,GWL_WNDPROC, LongInt(FClientInstance));
end;



procedure TFormMain.ClientWndProc(var Message: TMessage);
var
Dc : hDC;
Row,col: Integer;
Bit : TBitmap;
begin
with Message do
case Msg of
WM_KEYDOWN:
ProcesarTeclado(Message);
bla, bla bla....
Result := 1;
end;
else
Result := CallWindowProc(FPrevClientProc,
ClientHandle,
Msg,
wParam,
lParam);
end;


end;