![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
WM_QUERYENDSESSION [D7, WinXP]
Андрей Молчанов © (2005-08-21 12:35:00)Здравствуйте!
Я хочу, чтобы при выходе из Windows моя программа выполнила копирование некоторых довольно больших файлов. Пишу:
protected
procedure WMShutDown(var msg: TMessage); message WM_QUERYENDSESSION;
...
procedure TfrmMain.WMShutDown(var msg: TMessage);
begin
msg.Result := 0;
try
Logoff := True;
tmrSchedulerTimer(Self);
finally
msg.Result := 1;
end;
end;
При этом появляется окно Windows - "Невозможно завершить программу, завершить сейчас?". Что делать? Пожалуйста, подскажите.
Alex Konshin (2005-08-22 01:29:00) [1]А что с ними будет, если компьютер выключен?
По сути проблема в том, сколько занимает это сохранение. Если несколько нескольких секунд или даже минут - компьютер может не успеть корректно сбросить свой кеш на диск при аварийном отключении питания (по сигналу UPS). Поэтому производить какие-то специальные действия по выключению не стоит. Да я вообще не понимаю, что такого срочного можно делать, кроме как скинуть что-то из памяти? Обрабытвать же файлы при выключении на мой взгляд вообще нонсенс, если это уж так надо можно закинуть в регистри в RunOnce вызов своей утилитки, которая сделает какие-то действия при последующем включениикомпьютера.
Андрей Молчанов (2005-08-21 19:24:00) [2]Вы думаете?
В принципе, функция ведь достаточно удобная - пользователь поработал на компьютере и затем перед выходом сохранил данные. Или нет?
Anatoly Podgoretsky (2005-08-21 18:50:00) [3]Андрей Молчанов (21.08.05 17:09) [20]
Представляй как серьезную ошибку конкурентов, так оно и есть на самом деле.
Андрей Молчанов (2005-08-21 18:49:00) [4]Сделал выводы. Спасибо всем ответившим.
Alexander Panov (2005-08-21 17:17:00) [5]Программа должна спросить о корректности перезагрузки или выключения компьютера у пользователя. Если в течение некоторого времени пользователь не ответил, программа должна корректно завершить работу. Если есть необходимость продолжения работы программы(это критично для ее правильной работы), то программа при с ледующем старте должна предложить пользователю продолжить незаконченные операции.
Андрей Молчанов (2005-08-21 17:09:00) [6]Но у конкурентов есть...
А может такой вариант: перед выключением компьютера программа спрашивает: "Будем бэкапить?" С нажимающейся через 5-30 секунд кнопкой Нет?
Джо (2005-08-21 16:53:00) [7]
> [18] Андрей Молчанов (21.08.05 16:49)
> И что тогда делать?
Не делать такую функцию планировщика.
Андрей Молчанов (2005-08-21 16:49:00) [8]
> Alex Konshin ©
И что тогда делать?
Anatoly Podgoretsky (2005-08-21 16:26:00) [9]Alex Konshin © (21.08.05 15:42) [16]
Он может потерять не данные, а файловую систему.
Alex Konshin (2005-08-21 15:42:00) [10]DrPass © (21.08.05 14:25) [7]
> Но все же хотелось бы такую схему: пользователь выключает
> компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь
> бэкапить данные. Если нет, то компьютер выключается, а если
> да, то данные бэкапятся и компьютер продолжает выключение
ИМХО, это самый правильный вариант. Подозреваю, что lparam как раз и указывает на режим завершения сессии. Впрочем, MSDN на этот счет молчит - так что стоит проверить самостоятельно.
Это совсем неправильный вариант. Shutdown может ининциироваться не только пользователем. Например, пользователь будет очень недоволен, если компьютер не выключился корректно по команде от UPS когда пропало питание на время, превышающее емкость батарей. В этом случае пользователь может потерять данные, и виновата будет твоя программа, с соответствующими финансовыми последствиями для ее автора. Второй вариант на вскидку - удаленный shutdown.
Андрей Молчанов (2005-08-21 15:26:00) [11]Ага, понял, спасибо.
begin...end (2005-08-21 15:21:00) [12]> Андрей Молчанов (21.08.05 14:55) [13]
if Msg.LParam and ENDSESSION_LOGOFF <> 0 then
// the user is logging off
Андрей Молчанов (2005-08-21 14:55:00) [13]Из msdn:
lParam
If this parameter includes ENDSESSION_LOGOFF, the user is logging off. (Note that this parameter is a bit mask. To test for this value, use a bit-wise operation; do not test for equality.)
А как правильно проверять этот параметр?
GuAV (2005-08-21 14:53:00) [14]
> А можно хотя бы отличить выключение и перезагрузку от
> завершения сессии?
Это можно.
Андрей Молчанов (2005-08-21 14:48:00) [15]А можно хотя бы отличить выключение и перезагрузку от завершения сессии?
Андрей Молчанов (2005-08-21 14:47:00) [16]А может просто найти окно Windows "Невозможно завершить программу, завершить сейчас?" и скрыть его через ShowWindow?
GuAV (2005-08-21 14:35:00) [17]Как вариант, диалог вроде этого
const
sShutDown = 'The machine is about to shutdown and backup has not been made.'
+ sLineBreak + 'Would you want to make backup now ?';
procedure TForm1.Button1Click(Sender: TObject);
var Dialog: TForm; R: TRect; CheckBox: TCheckBox; ComboBox: TComboBox;
begin
Dialog := CreateMessageDialog(sShutDown, mtConfirmation, [mbYes, mbNo]);
try
Dialog.Height := Dialog.Height + 24;
R := Dialog.ClientRect;
R.Top := R.Bottom - 24;
Inc(R.Left, 8);
R.Right := R.Left + 120;
CheckBox := TCheckBox.Create(Dialog);
CheckBox.Parent := Dialog;
CheckBox.BoundsRect := R;
CheckBox.Caption := 'On complete backup';
R.Left := R.Right + 8;
R.Right := Dialog.ClientWidth - 8;
ComboBox := TComboBox.Create(Dialog);
ComboBox.Parent := Dialog;
ComboBox.BoundsRect := R;
ComboBox.Style := csDropDownList;
ComboBox.Items.Text := 'Shutown computer'+ sLineBreak +'Restart computer';
ComboBox.ItemIndex := 0;
Dialog.ShowModal;
finally
Dialog.Free;
end;
end;
Джо (2005-08-21 14:33:00) [18]
> [7] DrPass © (21.08.05 14:25)
Нет, это уже обсуждалось. Вроде пришли к выводу, что отличить выключение от перезагрузки не представляется возможным.
DrPass (2005-08-21 14:25:00) [19]
> Но все же хотелось бы такую схему: пользователь выключает
> компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь
> бэкапить данные. Если нет, то компьютер выключается, а если
> да, то данные бэкапятся и компьютер продолжает выключение
ИМХО, это самый правильный вариант. Подозреваю, что lparam как раз и указывает на режим завершения сессии. Впрочем, MSDN на этот счет молчит - так что стоит проверить самостоятельно.
Андрей Молчанов (2005-08-21 13:52:00) [20]Спасибо, это тоже вариант.
Но все же хотелось бы такую схему: пользователь выключает компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь бэкапить данные. Если нет, то компьютер выключается, а если да, то данные бэкапятся и компьютер продолжает выключение. В принципе можно просто выключить компьютер самому после завершения операции, но тогда компьютер выключится даже если пользователь перезапускал его.
Может есть способ узнать, как именно пользователь выключал компьютер? Это был бы наверное идеальный вариант.