 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mie 03 Nov, 2021 12:51 am Asunto: MessageBox -> Close() |
|
|
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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mie 03 Nov, 2021 4:32 am Asunto: |
|
|
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 |
|
 |
Felip Master

Registrado: 09 Jun 2004Mensajes: 200
|
Publicado: Mie 03 Nov, 2021 4:52 am Asunto: |
|
|
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 |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Dom 07 Nov, 2021 12:26 pm Asunto: |
|
|
| muy bueno felip..... creo que lo utilizare yo tambien |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Sab 13 Nov, 2021 9:42 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|