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 

MessageBox -> Close()

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: MessageBox -> Close() Responder citando

Convertí un código de Delphi a BCB que cierra automáticamente un messagebox (o showmessage) después de unos segundos.
El problema es que el código busca la ventana con foco para cerrarla. Si otra ventana toma el foco, se cerrará en lugar del cuadro de mensaje:
Código:

VOID CALLBACK CloseMessageBox( HWND  AWnd , UINT  AMsg , UINT_PTR  AIDEvent , DWORD  ATicks )
{
  HWND Wnd;
  KillTimer(AWnd, AIDEvent);
  // active window of the calling thread should be the message box
  Wnd = GetForegroundWindow();
  if ( IsWindow(Wnd) == true )    {
    PostMessage(Wnd, WM_CLOSE, 0, 0);
  }
}

//====

void __fastcall TForm1::Button3Click(TObject *Sender)
{
 UINT_PTR TimerId;
  TimerId = SetTimer(0, 0, 3 * 1000, (TIMERPROC) &CloseMessageBox);
 // Application->MessageBox("Will auto-close after 3 seconds...", NULL);
 ShowMessage("Teste de fechamento...");
  // prevent timer callback if user already closed the message box
  KillTimer(0, TimerId);
}

fuente: https://stackoverflow.com/questions/4472215/close-delphi-dialog-after-x-seconds

¿Alguna idea de como resolver esto?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Solucionado:

Código:

VOID CALLBACK CloseMessageBox( )
{
  HWND Wnd;
  Wnd = GetActiveWindow();
  if ( IsWindow(Wnd) == true )    {
    PostMessage(Wnd, WM_CLOSE, 0, 0);
  }
}

//====

void __fastcall TForm1::Button3Click(TObject *Sender)
{
  UINT_PTR TimerId;
  TimerId = SetTimer(0, 0, 3 * 1000, (TIMERPROC) &CloseMessageBox);
  Application->MessageBox("Will auto-close after 3 seconds...", NULL); 
  KillTimer(0, TimerId);
}
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Para facilitar el uso:

Código:

VOID CALLBACK CloseMessageBox( )
{
  HWND Wnd;
  Wnd = GetActiveWindow();
  if ( IsWindow(Wnd) == true )    {
    PostMessage(Wnd, WM_CLOSE, 0, 0);
  }
}

//====

ShowMessageTimer( String msg, int temp )
{
  UINT_PTR TimerId;
  TimerId = SetTimer(0, 0, temp * 1000, (TIMERPROC) &CloseMessageBox);
  ShowMessage( msg );
  KillTimer(0, TimerId);
}


Para llamar

Código:

void __fastcall TForm1::Button5Click(TObject *Sender)
{
   ShowMessageTimer( "Timer / ShowMessage", 3 );
}


para "messagebox, simplemente agregue / adapte los parámetros
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

muy bueno felip..... creo que lo utilizare yo tambien
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Existe una API indocumentada que crea un MessageBox que se autocuierra pasado un tiempo: MessageBoxTimeout

Código:

int MessageBoxTimeout(HWND hWnd, char *lpText, char *lpCaption, UINT uType, WORD wLanguageId, DWORD dwMilliseconds)
{
  typedef int (__stdcall *PMessageBoxTimeout)(IN HWND hWnd, IN LPCSTR lpText, IN LPCSTR lpCaption, IN UINT uType, IN WORD wLanguageId, IN DWORD dwMilliseconds);
  PMessageBoxTimeout MessageBoxTimeoutA = NULL;
  MessageBoxTimeoutA = (PMessageBoxTimeout)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxTimeoutA");
  if(MessageBoxTimeoutA)
    return MessageBoxTimeoutA(hWnd, lpText, lpCaption, uType, wLanguageId, dwMilliseconds);
  else
    return MessageBox(hWnd, lpText, lpCaption, uType);
}



Saludos.
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.