zamykanie programu przez windę

0

Witam.
wydaje mi sie ze widzialem gdzies poruszany moj problem ale nie moge go teraz znaleźć a rozwiazania nie znam , stad nowy temat.
Chodzi o to, że nie pozwalam zamknac programu krzyzykiem dajac w onclosequery false na canclose a zamykam program wylacznie "ręcznie" przez application.terminate wtedy kiedy chcę. No i problem jest kiedy program jest uruchomiony a chce zamknac system. Program poporstu nie pozala zamknac systemu. Nie wiem jak i gdzie przechwycic komunikat z windy ze program ma byc zamkniety. Probowalem w onclose i canclosequery dopisywac jakies cody w oparciu o help z delphi, oraz dopisywac wlasna procedure application.onmessage ale bez powodzenia. Prosilbym o rozwiazanie, mam nadzieje ze jest ono proste tylko ja go zwyczajnie nie znam i nie moge na nie wpaść.
Z góry wielkie dzięki , pozdrawiam.

0

Nie wiem jakie 'rzeczy' dawałeś w OnClose i OnCloseQuery, ale wystarczy dać w OnClose:

Action:=CaNone;

a te inne 'rzeczy' ktore miales w OnCloseQuery i OnClose wywal i bedzie dobrze

0

Hmm... chyba mnie nie zrozumiałeś. Mi chodzi o to żeby program zamykał się wtedy gdy system jest zamykany, zeby moc stwierdzic ze system jest zamykany i wykonac wtedy niezbedne do prawidlowego zamlkniecia programu procedury i zamknac go. Problem w tym ze on sie nie zamyka i system sie nie zamyka. Dopiero kiedy zamkne program moge zamknac system. A te rzeczy o kitorych wspmnialem to wlasnie proby uchwycenia informacji o tym ze system probuje zamknac program by mogl sie sam zamknac; to jest odczytanie zmiennej application.terminated ktora wg helpu powinna przyjac wartosc true no a nie przyjmuje oraz procedura application.onmessage, ktora wg. mojego jak widac blednego rozmienai powinna w zmiennej Tmsg.message dawac wartosc WM_QUIT wtedy gdy system probuje zamknac program no a niestety tego tez nie potrafie stwierdzic.
Heh, a moze to ja nie zrozumialem Twojej dosc oszczednej wypowiedzi :) Co wdług Ciebie mialoby dac to caNone?

0

Jak już wiesz że winda się zamyka a twój program to blokuje to zamknij windę przez swój program i daj terminate dla swojej aplikacji

0

Tak abj, wiem , bo to na ogol ja to robie wybierajac start->wylacz komputer :)
Ale chyba nie o to chodzi, a o to żeby w programie móc stwierdzic ze sie winda chce zamknąc.

0
    //.....

type
  TMainForm = class(TForm)
    //......
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure WndProc(var Message: TMessage);override;
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  MainForm: TMainForm;
  CanExit : Boolean;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if CanExit then
    CanClose := True
  else CanClose := False ;
end;

procedure TMainForm.WndProc(var Message: TMessage);
begin
  if Message.Msg = WM_QUERYENDSESSION then
  CanExit := True ;
  inherited WndProc(Message);
end;
0

Heh, a moze to ja nie zrozumialem Twojej dosc oszczednej wypowiedzi :-)
Co wdług Ciebie mialoby dac to caNone?

no to może rozwine swoją myśl :-) być może Dominik rozwiązał już Twój problem, ale wydaje mi sie że nie trzeba aż tak kombinować jak on :) twój drugi post wyjaśnił mi co chcesz osiagnąć, czyli, w OnClose formy dajesz:

//próba zamknięcia programu:
{tutaj dajesz te niezbędne rzeczy do prawidłowego zamknięcia programu, o ktorych pisaleś w swoim drugim poście, domyślam sie że są to rzeczy w stylu zapisania ustawień programu}

Action:=CaNone; //Nie dopuszczamy do zamknięcia programu, ale windows sie bez problemu zamknie, gdy jest odpalony Twój program

a nie wiem po co przechwytywać to że użytkownik chce wyłączyć kompa ? procedura OnClose wykonuje sie zarówno wtedy gdy użytkownik probuje wyłączyć program (obojetnie w jaki sposób, np poprzez 'x', lub przez alt+f4), no a także gdy użytkownik próbuje wyłączyć kompa, bo wtedy też zamyka sie najpierw program. No chyba że wykonujesz inne rzeczy w przypadku wyłączenia programu, a inne w przypadku wyłączenia kompa, wtedy pomocny będzie kod Dominika (tak mi sie zdaje przynajmniej :-) )

0

Jak wykryć zamykanie Windows

{nadpisanie procedury przechwytujacej komunikaty}
private
procedure WndProc(var Message: TMessage);override;
end;

var Form1: TForm1;
implementation
procedure TForm1.WndProc(var Message: TMessage);
begin
{identyfikacja komunikatu zamykania Windows}
if Message.Msg = WM_QUERYENDSESSION then
begin
{tu nalezy wprowadzic akcje np. pozwalajaca na 
zamkniecie Windows lub tez nie...}
end;
inherited WndProc(Message);
end;

pozdrawiam

ShowMessage('Niech Delphi będzie z Tobą');
0

Dzięki Dominik, właśnie o to mi chodziło.
(jas_dream, Twoj sposob jest bardzo podobny do tego co pokazał Dominik, ale też dziękuję)
Problem jednak w tym, że nie chce mi to działać na winxp. Sprawdzałem tez na win98 i wszystko jest tak jak byc powinno. Moze to wina niestabilności tego xp, więc wróce do wątku jesli po przeinstalowaniu będa problemy.
Jeszcze raz wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1