Exibir uma caixa de mensagem modal do sistema TopMost com Delphi

Com aplicativos de desktop (Windows), um caixa de mensagem (caixa de diálogo) é usado para alertar o usuário do aplicativo de que alguma ação precisa ser executada, que alguma operação foi concluída ou, em geral, para chamar a atenção dos usuários.

Dentro Delphi, existem várias maneiras de exibir uma mensagem para o usuário. Você pode usar qualquer uma das mensagens prontas que exibem rotinas fornecidas no RTL, como ShowMessage ou InputBox; ou você pode criar sua própria caixa de diálogo (para reutilização): CreateMessageDialog.

Um problema comum com todas as caixas de diálogo acima é que elas requer que o aplicativo esteja ativo para ser exibido ao usuário. "Ativo" refere-se a quando seu aplicativo tem o "foco de entrada".

Se você realmente quer chamar a atenção do usuário e impedi-lo de fazer qualquer outra coisa, você precisa ser capaz de exibir uma caixa de mensagem superior do sistema-modal, mesmo quando seu aplicativo não estiver ativo.

Caixa de mensagens superior ao sistema-modal

Mesmo que isso possa parecer complicado, na realidade não é.

instagram viewer

Como o Delphi pode acessar facilmente a maioria das chamadas da API do Windows, executar a função da API do Windows "MessageBox" fará o truque.

Definido na unidade "windows.pas" - a incluída por padrão na cláusula uses de todos os formulários Delphi, a Caixa de mensagem A função cria, exibe e opera uma caixa de mensagem. A caixa de mensagem contém uma mensagem e um título definidos pelo aplicativo, juntamente com qualquer combinação de ícones e botões predefinidos.

Veja como a MessageBox é declarada:

função Caixa de mensagem(

hWnd: HWND;
lpText,
lpCaption: PAnsiChar;
uType: Cardinal): inteiro;

O primeiro parâmetro, hwnd, é o identificador da janela do proprietário da caixa de mensagem a ser criada. se você criar uma caixa de mensagem enquanto uma caixa de diálogo estiver presente, use um identificador para a caixa de diálogo como o hWnd parâmetro.

o lpText e lpCaption especifique a legenda e o texto da mensagem que é exibido na caixa de mensagem.

Última é a uType parâmetro e é o mais interessante. Este parâmetro especifica o conteúdo e o comportamento da caixa de diálogo. Este parâmetro pode ser uma combinação de vários sinalizadores.

Exemplo: Caixa de aviso modal do sistema quando a data / hora do sistema é alterada

Vamos dar uma olhada em um exemplo de criação de uma caixa de mensagem superior modal do sistema. Você vai lidar com a mensagem do Windows despachado para todos os aplicativos em execução quando o alterações de data / hora do sistema- por exemplo, usando o miniaplicativo "Painel de controle de propriedades de data e hora".

A função MessageBox será chamada como:

 Janelas. Caixa de mensagem(

 lidar com,

 'Esta é uma mensagem modal do sistema' # 13 # 10 'de um aplicativo inativo',

 'Uma mensagem de um aplicativo inativo!',

 MB_SYSTEMMODAL ou MB_SETFOREGROUND ou MB_TOPMOST ou MB_ICONHAND);

A peça mais importante é o último parâmetro. O "MB_SYSTEMMODAL ou MB_SETFOREGROUND ou MB_TOPMOST" garante que a caixa de mensagem seja modal do sistema, superior e se torne a janela do primeiro plano.

  • MB_SYSTEMMODAL O sinalizador garante que o usuário responda à caixa de mensagem antes de continuar o trabalho na janela identificada pelo parâmetro hWnd.
  • MB_TOPMOST O sinalizador especifica que a caixa de mensagem deve ser colocada acima de todas as janelas não superiores, e deve permanecer acima delas, mesmo quando a janela estiver desativada.
  • MB_SETFOREGROUND O sinalizador garante que a caixa de mensagem se torne a janela em primeiro plano.

Aqui está o código de exemplo completo (TForm chamado "Form1" definido na unidade "unit1"):

unidade Unidade 1;

interface


usa

 Windows, Mensagens, SysUtils, Variantes, Classes,

 Gráficos, controles, formulários, caixas de diálogo, ExtCtrls;


tipo

 TForm1 = classe(TForm)

privado

procedimento WMTimeChange (var Msg: TMessage); mensagem WM_TIMECHANGE;

público

{Declarações públicas}

fim;

var

 Formulário1: TForm1;


implementação{$ R * .dfm}


procedimento TForm1.WMTimeChange (var Msg: TMessage);

início

 Janelas. Caixa de mensagem(

 lidar com,

 'Esta é uma mensagem modal do sistema' # 13 # 10 'de um aplicativo inativo',

 'Uma mensagem de um aplicativo inativo!',

 MB_SYSTEMMODAL ou MB_SETFOREGROUND ou MB_TOPMOST ou MB_ICONHAND);

fim;

fim.

Tente executar este aplicativo simples. Verifique se o aplicativo está minimizado ou pelo menos se algum outro aplicativo está ativo. Execute o applet do painel de controle "Propriedades de data e hora" e altere a hora do sistema. Assim que você pressionar o botão "Ok" (no applet), a caixa de mensagem superior modal do sistema do seu aplicativo inativo será exibida.

instagram story viewer