Witam.
Mam pytanie - jak rozróżnić zamykanie systemu Windows XP od próby ponownego uruchomienia komputera?
Mam program, który co n- zamknięć systemu powinien wstrzymać proces zamykania (restartu), uruchomić defragmentację, po jej zakończeniu ponowić ten proces. Zamykanie wykrywam dzięki komunikatowi WM_ENDSESSION (niestety, z WM_QUERYENDSESSION jest problem - pomija go, więc mogę obsłużyć jedynie WM_ENDSESSION, jednak mniejsza z tym).
W obsłudze procedury wykrywającej WM_ENDSESSION (która jest wywoływana zarówno podczas zamykania, jak i restartu) mam wywołanie do funkcji, która sprawdza czy system zamknięto odpowiednią ilość razy, jeżeli tak, to uruchamia defragmentację, jeżeli nie - to uruchamia systemowy program shutdown.exe z odpowiednimi parametrami.
Z tego co wyczytałem w SDK powinno się chyba zwrócić 0 aby dokonać zamknięcia systemu, jednak stosując analogicznie do przykładów z WM_QUERYENDSESSION takie coś:
Message.Result := 0;
nic się nie dzieje. Dlatego uruchamiam shutdown.exe. Wydaje mi się, że wina leży po mojej stronie - chyba nie potrafię poprawnie zwrócić tego parametru... Obsługa procedury WM_ENDSESSION wygląda mniej więcej tak:
procedure WMEndSession(var Message: TMessage); message WM_ENDSESSION;
(...)
procedure TForm1.WMEndSession(var Message: TMessage);
begin
if Zamykanie then // sprawdza, czy któryś z dysków ma zostać zdefragmentowany podczas zamykania
gZamykanie := True // po zakończeniu defragmentacji sprawdzany jest stan tej zmiennej, jeśli True, to należy zamknąć system
else
WinExec('shutdown.exe -s -f -t 0', SW_HIDE); //tutaj próbowałem stosować zamiast tego Message.Result := 0;
end;
Funkcja Zamykanie zajmuje się już ewentualnym uruchomieniem defragmentacji, tak więc w tej procedurze jest jedynie ustawienie stanu zmiennej gZamykanie (mogło by to co prawda być zawarte w funkcji, ale nie musi być) lub zamykanie systemu.
Zresztą, nawet gdyby udało się pominąć wywoływanie programu shutdown.exe i zamykać poprzez zwrócenie jakiegoś parametru, to i tak rozwiązuje to jedynie przypadek, gdy podczas zamykania systemu nie należy przeprowadzić defragmentacji. Co innego, gdy takie coś wystąpi - wtedy wyłączanie jest wstrzymywane, po czym przeprowadzana jest defragmentacja, po jej zakończeniu chciałbym właśnie w zależności od tego, jak użytkownik zamykał system, albo zamknąć, albo uruchomić ponownie komputer. Czy ktoś się orientuje, jak to rozróżnić? Delphi 2005 dla Win32.