| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Lun 20 Jun, 2005 10:45 pm Asunto: mouse preview en form |
|
|
Hola,
Necesito detectar la inactividad sobre un formulario.
Para eso activo la propiedad keypreview y fácilmente puedo saber cuando se presiona una tecla sobre cualqueir control.
También me gustaría hacer algo parecido con el mouse pero no he podido. Intenté mapeando el mensaje WM_MouseMove y en ciertos casos resulta bien, pero cuando el mouse pasa por algún panel o tab no me queda otra que codificar el evento de esos controles y en un formulario con muchos controles eso duele bastante.
Mi pregunta es, ¿habrá alguna manera elegante de hacer esto?
gracias por leer
atte _________________ Adrián
http://adrian.org.ar |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Mar 21 Jun, 2005 4:28 pm Asunto: |
|
|
parece que irá perfecto.
Gracias! _________________ Adrián
http://adrian.org.ar |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Dom 26 Jun, 2005 11:35 pm Asunto: |
|
|
Hola César, probé tu ejemplo y la verdad no me sirvió para lo que quería, es decir yo tengo un form activo y sobre el deseo capturar el movimiento del mouse.
Haciendo esto:
| Código: |
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_MOUSEMOVE,TMessage,MouseMove)
END_MESSAGE_MAP(TForm)
|
EL evento no se captura sobre paneles y otros controles. Por lo cual no llego a dar con otra solución que codificar control por control.
atte _________________ Adrián
http://adrian.org.ar |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 27 Jun, 2005 1:31 am Asunto: |
|
|
Hola ikis:
Si lo que necesitas es saber las coordenadas del ratón sobre el form aunque este sobre algún control puedes usar el código que hay al final de este enlace:
https://cppbuilder.es/viewtopic.php?t=9097 |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Lun 27 Jun, 2005 1:51 am Asunto: |
|
|
Gracias Leo, pero no me ha funcionado.
En el OnMessage del ApplicationEvents coloqué el siguiente código:
| Código: |
if (frmEnroll->Focused())
{
msg->Mensajear("Mensaje en frmEnroll", INFO);
if (Msg.message == WM_MOUSEMOVE || Msg.message == WM_KEYDOWN){
frmEnroll->Movimiento();
msg->Mensajear("Mensaje en frmEnroll de mouse o teclado", INFO);
}
}
|
Pero nunca llega a entrar. Me parece que los eventos del mouse no les está llegando al objeto Application.
atte _________________ Adrián
http://adrian.org.ar |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 27 Jun, 2005 2:15 am Asunto: |
|
|
Quizás es por "frmEnroll->Focused()". Has probado el ejemplo tal cual para ver si te funciona y si es lo que necesitas ?
Si lo que intentas con "..Focused()" es que funcione solo cuando ese form este activo cámbialo por "frmEnroll->Active".
De todas formas si no te vale, siempre puedes crear un hook dentro de la propia aplicación (no es necesario usar ninguna DLL). Si te gusta mas este método avísame y pongo un pequeño ejemplo. |
|
| Volver arriba |
|
 |
ikis Master


Registrado: 28 Dic 2002Mensajes: 703Ubicación: Madrid, España
|
Publicado: Lun 27 Jun, 2005 3:16 am Asunto: |
|
|
en el blanco como siempre Leo. Utilizando la propiedad Active anda perfecto.
De todos modos me gustaría ver ese ejemplo utilizando hooks.
gracias! |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 27 Jun, 2005 3:24 am Asunto: |
|
|
Vendría a ser algo así. (No hay comentarios pero creo que no es difícil de entender)
| Código: | //----------------------------------------------------------------------
HHOOK gHookHandle;
TForm* gHookForm;
//----------------------------------------------------------------------
LRESULT CALLBACK MouseProc(int code, WPARAM wp, LPARAM lp)
{
PMOUSEHOOKSTRUCTEX mhs = reinterpret_cast<PMOUSEHOOKSTRUCTEX>(lp);
if (code == HC_ACTION && wp == WM_MOUSEMOVE
&& (mhs->hwnd == gHookForm->Handle
|| IsChild(gHookForm->Handle, mhs->hwnd))
&& gHookForm->Active)
{
::ScreenToClient(gHookForm->Handle, &mhs->pt);
gHookForm->Caption = String().sprintf("X=%d, Y=%d",
mhs->pt.x, mhs->pt.y);
}
return CallNextHookEx(gHookHandle, code, wp, lp);
}
//----------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
gHookForm = this;
gHookHandle = SetWindowsHookEx(WH_MOUSE,
reinterpret_cast<HOOKPROC>(MouseProc), 0, GetCurrentThreadId());
}
//----------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
UnhookWindowsHookEx(gHookHandle);
}
//---------------------------------------------------------------------- |
|
|
| Volver arriba |
|
 |
|