Cómo mostrar un buzón de mensajes del sistema modal más avanzado con Delphi

En las aplicaciones de escritorio (Windows), se utiliza un cuadro de diálogo para alertar al usuario de la aplicación de la necesidad de realizar alguna acción, de que se ha completado alguna operación o, en general, para llamar la atención del usuario.

 

En Delphi, hay varias maneras de mostrar un mensaje al usuario. Puede utilizar cualquiera de las rutinas de visualización de mensajes ya preparadas que se proporcionan en la RTL, como ShowMessage o InputBox; o puede crear su propio cuadro de diálogo (para reutilizar): Diálogo CreateMessageDialog.

 

Un problema común con todos los cuadros de diálogo anteriores es que requieren que la aplicación esté activa para que se muestre al usuario. "Activo" se refiere a cuando su aplicación tiene el "foco de entrada".

Si realmente desea captar la atención del usuario y evitar que haga otra cosa, debe ser capaz de mostrar un cuadro de mensaje superior del sistema modal incluso cuando su aplicación no esté activa.

Buzón de mensajes de la parte superior de la mayoría de los modos del sistema

Aunque esto pueda parecer complicado, en realidad no lo es.

 

Dado que Delphi puede acceder fácilmente a la mayoría de las llamadas de la API de Windows, la ejecución de la función "MessageBox" de la API de Windows hará el truco.

 

Definida en la unidad "windows.pas" -- la que se incluye por defecto en la cláusula de usos de cada formulario Delphi, la función MessageBox crea, muestra y opera un cuadro de mensajes. El cuadro de mensaje contiene un mensaje y un título definidos por la aplicación, junto con cualquier combinación de iconos y botones predefinidos.

Así es como se declara el MessageBox:

 

function MessageBox(  hWnd: HWND;  lpText,  lpCaption : PAnsiChar;  uType : Cardinal) : integer;

 

El primer parámetro, hwnd, es el control de la ventana de propietario de la ventana de mensaje que se va a crear. Si crea una ventana de mensaje mientras hay una caja de diálogo, utilice un control de la caja de diálogo como parámetro hWnd.

 

El lpText y lpCaption especifican el título y el texto del mensaje que se muestra en el cuadro de mensaje.

 

El último es el parámetro uType y es el más interesante. Este parámetro especifica el contenido y el comportamiento del cuadro de diálogo. Este parámetro puede ser una combinación de varios indicadores.

Un ejemplo: Casilla de advertencia de sistema modal cuando cambia la fecha/hora del sistema

Echemos un vistazo a un ejemplo de creación de un cuadro de mensajes modal de sistema en la parte superior. Manejará el mensaje de Windows que se envía a todas las aplicaciones en ejecución cuando cambia la fecha/hora del sistema, por ejemplo, utilizando el applet "Propiedades de fecha y hora" del Panel de control.

 

La función MessageBox se llamará como:

 

  Windows.MessageBox(    handle,    'This is a system modal message'#13#10'from an inactive application',    'A message from an inactive application!',    MB_SYSTEMMODAL or MB_SETFOREGROUND or MB_TOPMOST or MB_ICONHAND) ;

 

La pieza más importante es el último parámetro. El "MB_SYSTEMMODAL o MB_SETFOREGROUND o MB_TOPMOST" asegura que el cuadro de mensaje es el sistema modal, el más superior y se convierte en la ventana de primer plano.

  • El indicador MB_SYSTEMMODAL asegura que el usuario debe responder al cuadro de mensaje antes de continuar el trabajo en la ventana identificada por el parámetro hWnd.
  • El indicador MB_TOPMOST especifica que el cuadro de mensaje debe colocarse sobre todas las ventanas que no están en el extremo y debe permanecer por encima de ellas, incluso cuando la ventana está desactivada.
  • El indicador MB_SETFOREGROUND garantiza que el cuadro de mensaje se convierta en la ventana de primer plano.

 

Aquí está el código de ejemplo completo (TForm llamado "Form1" definido en la unidad "unit1"):

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes,  Graphics, Controls, Forms, Dialogs, ExtCtrls;type  TForm1 = class(TForm)  private    procedure WMTimeChange(var Msg: TMessage) ; message WM_TIMECHANGE;  public    { Public declarations }  end;var  Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WMTimeChange(var Msg: TMessage) ;begin  Windows.MessageBox(    handle,    'This is a system modal message'#13#10'from an inactive application',    'A message from an inactive application!',    MB_SYSTEMMODAL or MB_SETFOREGROUND or MB_TOPMOST or MB_ICONHAND) ;end;end.

 

Intente ejecutar esta sencilla aplicación. Asegúrese de que la aplicación esté minimizada, o al menos que haya alguna otra aplicación activa. Ejecute el applet "Propiedades de fecha y hora" del Panel de control y cambie la hora del sistema. Tan pronto como pulse el botón "Ok" (en el applet) se mostrará el cuadro de mensaje modal superior de su aplicación inactiva.

(0 votes)