Delphi - A Windows-ból való kilépés, vagy az újraindítás eseményének figyelése

forráskód letöltése
Bármilyen alkalmazásnál előfordulhat olyan eset, hogy az alkalmazásból való kilépés előtt bizonyos műveleteket el kell végezni (pl. memória felszabadítás, bufferek ürítése, stb.). Igen ám, csakhogy amikor a felhasználó valamilyen módon kilép a Windows-ból (pl. újraindítja), akkor a kilépés egy kicsit másképpen történik meg, mint egyébként, így például a destruktorok, és a Form-ok OnClose eseményei nem futnak le. A mellékelt példában azt nézzük meg, hogy miként értesülhetünk arról, hogy a Windows kilép. Amikor a felhasználó, vagy valamilyen alkalmazás a Windows-ból való kilépésről, vagy újraindításról rendelkezik, akkor az alkalmazások a WM_QURYENDSESSION eseményt kapják. Ekkor eldönthetik, hogy engedélyezik-e a kilépést, vagy nem. Ez az esemény azonban pont emiatt nem közli az alkalmazással egyértelműen, hogy a Windows befejezi futását, csak azt, hogy be szeretné fejezni. Van azonban még egy üzenet, a WM_ENDSESSION, amit viszont már akkor kap az alkalmazás, amikor már biztos, hogy a Windows kilép. Ehhez az üzenethez kell egy eljárást készíteni, ami a szükséges feladatokat végrehajtja a program bezárása előtt.
  procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
A mellékelt példaprogramban létrehoztunk egy eljárást az OnClose eseményhez, és a Form destruktorát is felülírtuk. Így kaptunk három eljárást, amelyek mindegyike egy-egy fájlt hoz létre a program könyvtárában. Próbáljuk ki, hogy a program elindítása után egyszerűen bezárjuk azt. Ekkor először létrejön a 2.txt (OnClose esemény) és a 3.txt (destruktor) nevű fájl. Töröljük ezt a két fájlt, és indítsuk el újra a programot. Indítsuk újra a Windows-t, és láthatjuk, hogy most csak az 1.txt (WMEndSession) fájl jött létre.