Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Вниз

WM_QUERYENDSESSION   Найти похожие ветки 

 
Андрей Молчанов   (2005-08-21 12:35) [0]

Здравствуйте!

Я хочу, чтобы при выходе из 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 - "Невозможно завершить программу, завершить сейчас?". Что делать? Пожалуйста, подскажите.


 
DrPass ©   (2005-08-21 13:25) [1]

Если это предназначено только для твоей машины, то нужно увеличить в Windows время ожидания завершения программ, чтобы его хватало на завершение работы. Это можно сделать с помощью большинства твикеров.
Если программу предполагается распространять, то лучше переделать ее таким образом, чтобы она не занималась длительными операциями при завершении работы.


 
Андрей Молчанов   (2005-08-21 13:31) [2]

Программу (предназначена для резервного копирования данных) предполагается распространять.
Я хочу добавить возможность выполнения резервного копирования перед выходом из системы.
Может быть можно узнать, как именно пользователь хотел выйти (перезагрузка, выход из сеанса, выключение)?


 
Anatoly Podgoretsky ©   (2005-08-21 13:34) [3]

Не то место для выполнения подобных операций. Здесь надо мгновенно закрываться, а не насисловать систему, возможно это пропадания питания, а ты не позволяешь нормально выключиться.


 
Андрей Молчанов   (2005-08-21 13:37) [4]

Так я сначала спрошу пользователя, хочет ли он бэкапить данные.
К тому же опция по умолчанию будет выключена. А все же, как это можно осуществить?


 
GuAV ©   (2005-08-21 13:46) [5]

Можно спросить пользователя, желает ли он отменить выключение машины, чтобы бэкапить данные; при этом в случае бэкапа, при повторной попытке выключении этот вопрос уже возникать не должен.


 
Андрей Молчанов   (2005-08-21 13:52) [6]

Спасибо, это тоже вариант.
Но все же хотелось бы такую схему: пользователь выключает компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь бэкапить данные. Если нет, то компьютер выключается, а если да, то данные бэкапятся и компьютер продолжает выключение. В принципе можно просто выключить компьютер самому после завершения операции, но тогда компьютер выключится даже если пользователь перезапускал его.

Может есть способ узнать, как именно пользователь выключал компьютер? Это был бы наверное идеальный вариант.


 
DrPass ©   (2005-08-21 14:25) [7]


> Но все же хотелось бы такую схему: пользователь выключает
> компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь
> бэкапить данные. Если нет, то компьютер выключается, а если
> да, то данные бэкапятся и компьютер продолжает выключение

ИМХО, это самый правильный вариант. Подозреваю, что lparam как раз и указывает на режим завершения сессии. Впрочем, MSDN на этот счет молчит - так что стоит проверить самостоятельно.


 
Джо ©   (2005-08-21 14:33) [8]


>  [7] DrPass ©   (21.08.05 14:25)

Нет, это уже обсуждалось. Вроде пришли к выводу, что отличить  выключение от перезагрузки не представляется возможным.


 
GuAV ©   (2005-08-21 14:35) [9]

Как вариант, диалог вроде этого

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:47) [10]

А может просто найти окно Windows "Невозможно завершить программу, завершить сейчас?" и скрыть его через ShowWindow?


 
Андрей Молчанов   (2005-08-21 14:48) [11]

А можно хотя бы отличить выключение и перезагрузку от завершения сессии?


 
GuAV ©   (2005-08-21 14:53) [12]


> А можно хотя бы отличить выключение и перезагрузку от
> завершения сессии?

Это можно.


 
Андрей Молчанов   (2005-08-21 14:55) [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.)

А как правильно проверять этот параметр?


 
begin...end ©   (2005-08-21 15:21) [14]

> Андрей Молчанов   (21.08.05 14:55) [13]

if Msg.LParam and ENDSESSION_LOGOFF <> 0 then
 // the user is logging off


 
Андрей Молчанов   (2005-08-21 15:26) [15]

Ага, понял, спасибо.


 
Alex Konshin ©   (2005-08-21 15:42) [16]

DrPass ©   (21.08.05 14:25) [7]
> Но все же хотелось бы такую схему: пользователь выключает
> компьютер, появляется мой бэкап и спрашивает, хочет ли пользователь
> бэкапить данные. Если нет, то компьютер выключается, а если
> да, то данные бэкапятся и компьютер продолжает выключение
ИМХО, это самый правильный вариант. Подозреваю, что lparam как раз и указывает на режим завершения сессии. Впрочем, MSDN на этот счет молчит - так что стоит проверить самостоятельно.

Это совсем неправильный вариант. Shutdown может ининциироваться не только пользователем. Например, пользователь будет очень недоволен, если компьютер не выключился корректно по команде от UPS когда пропало питание на время, превышающее емкость батарей. В этом случае пользователь может потерять данные, и виновата будет твоя программа, с соответствующими финансовыми последствиями для ее автора. Второй вариант на вскидку - удаленный shutdown.


 
Anatoly Podgoretsky ©   (2005-08-21 16:26) [17]

Alex Konshin ©   (21.08.05 15:42) [16]
Он может потерять не данные, а файловую систему.


 
Андрей Молчанов   (2005-08-21 16:49) [18]


> Alex Konshin ©

И что тогда делать?


 
Джо ©   (2005-08-21 16:53) [19]


>  [18] Андрей Молчанов   (21.08.05 16:49)
> И что тогда делать?

Не делать такую функцию планировщика.


 
Андрей Молчанов   (2005-08-21 17:09) [20]

Но у конкурентов есть...
А может такой вариант: перед выключением компьютера программа спрашивает: "Будем бэкапить?" С нажимающейся через 5-30 секунд кнопкой Нет?


 
Alexander Panov ©   (2005-08-21 17:17) [21]

Программа должна спросить о корректности перезагрузки или выключения компьютера у пользователя. Если в течение некоторого времени пользователь не ответил, программа должна корректно завершить работу. Если есть необходимость продолжения работы программы(это критично для ее правильной работы), то программа при с ледующем старте должна предложить пользователю продолжить незаконченные операции.


 
Андрей Молчанов   (2005-08-21 18:49) [22]

Сделал выводы. Спасибо всем ответившим.


 
Anatoly Podgoretsky ©   (2005-08-21 18:50) [23]

Андрей Молчанов   (21.08.05 17:09) [20]
Представляй как серьезную ошибку конкурентов, так оно и есть на самом деле.


 
Андрей Молчанов   (2005-08-21 19:24) [24]

Вы думаете?
В принципе, функция ведь достаточно удобная - пользователь поработал на компьютере и затем перед выходом сохранил данные. Или нет?


 
Alex Konshin ©   (2005-08-22 01:29) [25]

А что с ними будет, если компьютер выключен?

По сути проблема в том, сколько занимает это сохранение. Если несколько нескольких секунд или даже минут - компьютер может не успеть корректно сбросить свой кеш на диск при аварийном отключении питания (по сигналу UPS). Поэтому производить какие-то специальные действия по выключению не стоит. Да я вообще не понимаю, что такого срочного можно делать, кроме как скинуть что-то из памяти? Обрабытвать же файлы при выключении на мой взгляд вообще нонсенс, если это уж так надо можно закинуть в регистри в RunOnce вызов своей утилитки, которая сделает какие-то действия при последующем включении компьютера.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.10.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.041 c
14-1127804254
Empleado
2005-09-27 10:57
2005.10.23
Небольшие заметки. Бельгия.


3-1126169492
moor38
2005-09-08 12:51
2005.10.23
Поиск без учетом регистра (знаю, было, но не получается)


1-1128254250
Ivanov
2005-10-02 15:57
2005.10.23
добавление Item в TDXImageList


3-1125384126
Киря
2005-08-30 10:42
2005.10.23
Ошибка Fast Report


1-1127973069
mrDEAD
2005-09-29 09:51
2005.10.23
помогите срочняк





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский