Hur man visar en TopMost systemmodal meddelanderuta med Delphi

Med stationära (Windows) -applikationer, a meddelande (dialogruta) används för att varna användaren av applikationen att vissa åtgärder måste vidtas, att någon åtgärd slutfördes eller i allmänhet för att få användarnas uppmärksamhet.

I Delphi finns det flera sätt att visa ett meddelande till användaren. Du kan antingen använda något av de färdiga meddelandena som visar rutiner som finns på RTL, som ShowMessage eller InputBox; eller så kan du skapa en egen dialogruta (för återanvändning): CreateMessageDialog.

Ett vanligt problem med alla ovanstående dialogrutor är att de kräver att applikationen är aktiv för att visas för användaren. "Aktiv" avser när din applikation har "inmatningsfokus."

Om du verkligen vill fånga användarens uppmärksamhet och hindra dem från att göra något annat måste du kunna visa en systemmodal översta meddelanderuta även om din applikation inte är aktiv.

System-modal topp mest meddelanderuta

Även om detta kanske låter komplicerat, så är det verkligen inte.

Eftersom Delphi enkelt kan komma åt de flesta av Windows API-samtal kommer att utföra "MessageBox" Windows API-funktionen göra susen.

Definierad i enheten "windows.pas" - den som ingår som standard i användningsklausulen för varje Delphi-form, Meddelandebox funktionen skapar, visar och använder en meddelanderuta. Meddelanderutan innehåller ett applikationsdefinierat meddelande och titel, tillsammans med valfri kombination av fördefinierade ikoner och tryckknappar.

Så här förklaras MessageBox:

 fungera Meddelandebox(

  hWnd: HWND;
  lpText,
  lpCaption: PAnsiChar;
  uType: kardinal): heltal;

Den första parametern, hwnd, är handtaget i ägarfönstret i den meddelanderuta som ska skapas. Om du skapar en meddelanderuta medan en dialogruta finns, använd ett handtag till dialogrutan som hWnd parameter.

De lpText och lpCaption ange bildtexten och meddelandeteksten som visas i meddelanderutan.

Senast är uType parameter och är den mest intressanta. Denna parameter specificerar innehållet och beteendet i dialogrutan. Denna parameter kan vara en kombination av olika flaggor.

Exempel: Systemmodalvarningslåda när systemdatum / tid ändras

Låt oss ta en titt på ett exempel på att skapa en systemmodal översta meddelanderuta. Du hanterar Windows-meddelandet som skickas till alla löpande applikationer när systemdatum / tid ändras - till exempel med hjälp av applet-kontrollpanelen "Datum och tid".

MessageBox-funktionen kommer att kallas som:

   Windows.MessageBox (

     hantera,

     "Detta är ett systemmodellt meddelande" # 13 # 10 "från en inaktiv applikation",

     "Ett meddelande från en inaktiv applikation!",

     MB_SYSTEMMODAL eller MB_SETFOREGROUND eller MB_TOPMOST eller MB_ICONHAND);

Den viktigaste delen är den sista parametern. "MB_SYSTEMMODAL eller MB_SETFOREGROUND eller MB_TOPMOST" säkerställer att meddelanderutan är systemmodal, överst mest och blir förgrundsfönstret.

  • MB_SYSTEMMODAL flagg säkerställer att användaren måste svara på meddelanderutan innan han fortsätter arbeta i fönstret identifierat med hWnd-parametern.
  • MB_TOPMOST flagga anger att meddelanderutan ska placeras ovanför alla icke-översta fönster och ska stanna ovanför dem, även om fönstret är inaktiverat.
  • MB_SETFOREGROUND flagga säkerställer att meddelandelådan blir förgrundsfönstret.

Här är fullständig exempelkod (TForm med namnet "Form1" definierad i enhet "enhet1"):

 enhet Enhet 1;

gränssnitt

 

 användningar

   Windows, meddelanden, SysUtils, varianter, klasser,

   Grafik, kontroller, formulär, dialoger, ExtCtrls;

 

 typ

   TForm1 = klass(TForm)

  
privat

     procedur WMTimeChange (var Msg: TMessage); meddelande WM_TIMECHANGE;

  
offentlig

     Offentliga förklaringar

   slutet;

var

   Form1: TForm1;

 

 genomförande$ R * .dfm

 

 procedur TForm1.WMTimeChange (var Msg: TMessage);

Börja

   Windows.MessageBox (

     hantera,

     "Detta är ett systemmodellt meddelande" # 13 # 10 "från en inaktiv applikation",

     "Ett meddelande från en inaktiv applikation!",

     MB_SYSTEMMODAL eller MB_SETFOREGROUND eller MB_TOPMOST eller MB_ICONHAND);

slutet;

slutet.

Prova att köra den här enkla applikationen. Se till att applikationen är minimerad eller åtminstone att någon annan applikation är aktiv. Kör appletten "Datum och tid" på kontrollpanelen och ändra systemtiden. Så snart du trycker på "Ok" -knappen (på appletten) visas systemmodalens översta meddelanderuta från din inaktiva applikation.