|
A mellékelt példaprogram megnyitása előtt a CloseAllApp.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponensnek csak egy property-je van, a CloseOwnerApplication. Ez egy logikai típusú property, amelyben beállíthatjuk, hogy az az alkalmazás is be legyen-e zárva, amiben a komponenst felhasználjuk, vagy sem. Eseményből azonban van három is. Az OnStart és OnFinished a művelet elkezdése előtt, illetve után jönnek létre. Az OnCloseApp esemény minden alkalmazásnál létrejön, és a paramétereiben az éppen bezárandó ablakról ad át információkat (WHandle és WindowInfo paraméterek). Az eseményben eldönthetjük, hogy az ablakot bezárjuk-e vagy sem. Ha nem, akkor a Close paraméter értékét hamisra kell állítani (alapértelmezetten igaz).
A művelet az Execute eljárás meghívásával kezdődik. Két globális változóba elmentjük az Asztal (Progman) és a Tálca (Shell_TrayWnd) ablakok azonosítóit (HWND). Hogy erre miért van szükség, arról kicsit lejjebb lesz szó. Az EnumWindows függvénnyel sorban beolvastatjuk az ablakok azonosítóit. Az lParam paraméterben átadjuk a komponens objektumát, mivel erre szükség lesz az EnumWindowsProc függvényben, ami minden azonosítónál meghívódik. Ebben a függvényben paraméterként megkapjuk a soron következő ablak azonosítóját (Handle), és a komponens objektumát. Az IsWindow és az IsWindowVisible függvényekkel ellenőrizzük, hogy az azonosító ablakhoz tartozik-e, és az ablak látható-e. Mivel ennek a két kritériumnak megfelelnek a Progman és a Shell_TryWnd ablakok, ezért ezeket külön ellenőrizni kell, ezért kérdeztük le előzőleg ezek azonosítóját. Ha ezt a két ablakot is bezárnánk, akkor egyszerűen eltűnne az Asztal és a Tálca a képernyőről, és csak az Explorer újraindításával jeleníthetnénk meg újra.
A következő lépés a CloseOwnerApplication property értékének ellenőrzése. Ha az értéke hamis, akkor megnézzük, hogy a kapott azonosító nem az alkalmazás ablakáé-e. Ha igen, akkor ezt az ablakot nem zárjuk be, így az alkalmazást sem.
Generálunk egy OnCloseApp eseményt, és a Close paraméter értékétől függően eldöntjük, hogy az alkalmazást bezárjuk-e vagy sem. A bezárás úgy történik, hogy a PostMessage függvénnyel egy WM_CLOSE üzenetet küldünk az ablaknak.
|