Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

mouse preview en form

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: mouse preview en form Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Te sirve esto

https://cppbuilder.es/viewtopic.php?t=9338&highlight=inactividad
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

parece que irá perfecto.

Gracias!
_________________
Adrián

http://adrian.org.ar
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.