Отследить завершение работы Windows!!!

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Отследить завершение работы Windows!!!

Сообщение Scuder » 31.03.2004 (Ср) 12:04

Возможно это, в принципе? Система w2k.
Как перехватить этот процесс и отменить его?

Хелп!!!

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2004 (Ср) 13:04

Обрабатывай событие Form_QueryUnload.

В нем есть параметр UnloadMode. Еслион равен vbAppWindows, то это значит, система завершается. Ставь в Cancel = 1 и все. Выгрузка остановится.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.03.2004 (Ср) 13:15

vbAppWindows = 3?
Мне очень не хочется тестировать, потому что перезагрузка моего компа занимает до 10 минут. :-) А код, имхо, не тот..

Дело в том, что данная фишка скорее всего сработает в случае принудительного закрытия программы из диспетчера задач. Тут проблем нет. Следующий код это отлично делает..

Код: Выделить всё
Private Sub Form_Unload(Cancel As Integer)

Dim WinHwnd As Long
WinHwnd = 0

Do While WinHwnd = 0
     WinHwnd = FindWindow(vbNullString, "Завершение программы - DoNotOff")
    DoEvents
Loop

AppActivate ("Завершение программы - DoNotOff")
SendKeys "~", True

Cancel = 1
   
End If

End Sub


SendKeys "~", True "нажимает" на кнопку "Отмена".
Я думал, что этот код и при выключении системы сработает.. А оказалось, что при "завершении работы windows" системе до лампочки что там программы пытаются пикнуть.. через 10 (или сколько там?) секунд система их всё равно закроет..

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.03.2004 (Ср) 13:15

А вот и ни фига.
Через несколько секунд винда выдаст окошко "Не удается завершить задачу... Прибить ее или подождать чуть?".
Отменить помоему нельзя никак. Если успеешь, попробуй прибить процесс explorer, маловероятно, но может быть поможет.
Lasciate ogni speranza, voi ch'entrate.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.03.2004 (Ср) 13:24

Там в коде ошибка незначительная (не всё порезал), но это неважно..

А винда у меня даже такого сообщения не выдаёт.. Она сразу начинает её завершать. Окошком со статусбаром.. И, кстати, причём тут explorer?

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

Или другой вариант: "поменять" LogOff на Reboot.. :-) Хотя бы.. :-)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2004 (Ср) 13:26

Короче! Всем учить матчасть.

При завершении работы ОС ОС полсылает всем программам оповещение. Если хоть одна программа отвчает "нет", то завершение останавливается. Попробуйте хотя бы при той же открыйто студии, если есть изменения в проекте, нажать Cancel в диалоге и, так сказать, увидите.

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.03.2004 (Ср) 13:45

Блин. Действительно, работает.. Я думал, что Cancel и в Form_Unload и в Form_QueryUnload выполняет одну и ту же функцию.. :-)

Кул! Thx! :-)

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2004 (Ср) 15:40

Велкам :)

Scuder
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 334
Зарегистрирован: 17.08.2002 (Сб) 13:18
Откуда: Moscow, Russia

Сообщение Scuder » 31.03.2004 (Ср) 15:49

Кста, такой вопрос: завершаем работу windows. она начинает постепенно выгружать всё, что можно, пока не натолкнётся на мою программу. А как сделать так, чтобы она начинала выгрузку именно с моей программы, не трогая остальные? Как там приоритеты расставляются? Если вообще расставляются. И как в этом случае задать моей программе самый низкий приоритет, чтобы вида её первой тронула?

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 31.03.2004 (Ср) 16:00

Хм... Вот здесь я не могу много сказать. Я не в курсе точно, в каком порядке Windows выгружает программы. То ли по приоритету, то ли в обратном порядке заргузки...

Если мудрить с приоритетом. то я бы глянул в сторону
Код: Выделить всё
Private Declare Function SetPriorityClass Lib "kernel32" Alias "SetPriorityClass" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" Alias "GetCurrentProcessId" () As Long

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 02.04.2004 (Пт) 14:11

Выгрузка в nt происходит в следующе порядке:
1) окна в порядке z-order (то есть, кто выше - тот первый и закрываеться)
1) все службы с пометкой #USERNAME
2) все службы с помектой #SYSTEM
3) драйвера периферии
4) драйвера In/Out
5) ядро системы

Если на каком-то этапе проишла отмена, выгрузка остановиться
До этапа 3 система попытается даже вернуть убитые процессы обратно (на практике это редко получается ;-)) )

Отследить (и отменить с сохранением всех данных) завершение работы ОС на чистом VB без языка, на котором можно написать DLL нельзя. Можно только попытаться держать форму все время наверху ;-)))), но не TOPMOST, а именно активное окно!

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 2

    TopList