Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать Hook на выключение компьютера [D5, D6, Win95/98, NT4, Win2k, WinXP]


Страницы:   1 2

Sergey N ©   (2004-04-01 11:46:00) 

Доброе время суток!

Задача: Создать программку, перехватывающую сообщение о выключении/перезагрузке машины и в зависимости от решения пользователя либо продолжить данную операцию, либо просто ее игнорировать.
 Понимаю, что это делается с помощью SetWindowsHookEx, но не знаю как ее применить. Либо подменять функцию ExitWindow, или вешаться на какое-то сообщение.. Как подойти?
  Может есть скелет программы у кого?

Спасибо все отреагировавшим!


Anatoly Podgoretsky   (2004-04-19 15:59:00) [1]

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


Anatoly Podgoretsky   (2004-04-19 15:58:00) [2]

Taur ©   (18.04.04 15:54) [23]
Речь именно про бесперебойник, если этому делу препятствовать, то сказали топливо кончится.

Про управление кнопкой питания тебе сказали, но это не поможет против ресета или длительного удержания кнопки. А вот физически отключить обе эти кнопки стоит, при этом желательно что бы блок питания имел свою кнопку отключения.


YDV   (2004-04-19 15:44:00) [3]

1. на рабочем столе кликаем правой кнопкой мыши
2. переходим на закладку заставка
3. Энергосбережение -> Питание
4. переходим на закладку дополнительно
5. кнопки питания
5. при нажатии кнопки выключения питания -> действие не требуется и кнопка перестанет работать

Но все же интересно как перехватить только нажатие кнопки power, и так что бы другие приложения не закрывались ... интересная задача.


Taur   (2004-04-19 14:52:00) [4]

nikkie
Так ведь "При перехвате сообщения WM_QUERYENDSESSION, все другие проги закрываются", или я что-то не так делаю


nikkie   (2004-04-18 21:05:00) [5]

>маленький сынишка периодически подходит и жмет кнопку Power
тык нет проблем - ловишь WM_QUERYENDSESSION и кнопка Power и не нажимается уже... :)

а если серьезно, лучшее решение проблем - надавать ему по заднице, чтобы не нажимал. к печке, утюгам и т.п. он у вас не лезет?


Polevi   (2004-04-18 20:56:00) [6]

> [23] Taur ©   (18.04.04 15:54)
бесперобойник умеет выключать компьютер если у него заканчитается "топливо"
если помешать ему сделать это - см. [22]


Taur   (2004-04-18 15:54:00) [7]

Anatoly Podgoretsky
От пропадания питания никто не застрахован, если конечно нет бесперебойника!!! Прога нужна для дома, поскольку маленький сынишка периодически подходит и жмет кнопку Power на корпусе!!! И от этого бывают далеко не самые лучшие последствия :)! А комп на потолок вешать ,да и физически кнопку отрубать не охота,!


Anatoly Podgoretsky   (2004-04-18 11:47:00) [8]

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


Taur   (2004-04-18 10:07:00) [9]

Привет всем!
Sergey N, удалось ли написать подобную прогу?
При перехвате сообщения WM_QUERYENDSESSION, все другие проги закрываются, как бы и этого избежать? Хотелось бы, чтобы оключение попросту игнорировался!!!


Cobalt   (2004-04-02 19:33:00) [10]

2 Sergey N ©   (02.04.04 15:50) [19]
Не верить документации не имея на руках вопиющих фактов - глупо.


Sergey N   (2004-04-02 15:50:00) [11]

Игорь Шевченко ©   (02.04.04 15:22)
Т.е. предполагается, что приложение может сказать системе что-нибудь типа: "Я сейчас не хочу заканчивать работу, давай подождем часок-другой."? И система ответит: "Хорошо, давай, пошлю сообщение через час, а пока закрою другие приложения.".? Что-то не верится.


Игорь Шевченко   (2004-04-02 15:22:00) [12]

Sergey N ©   (02.04.04 15:08)


> Что нужно сделать, чтобы погасить перезагрузку/выключение/завершение
> сеанса?


F1 почитать, наверное, про сообщение WM_QUERYENDSESSION


Sergey N   (2004-04-02 15:08:00) [13]

Вот, перехватываю все WM_QUERYENDSESSION. Чтобы продолжить перезагрузку я должен просто протолкнуть их дальше. Что нужно сделать, чтобы погасить перезагрузку/выключение/завершение сеанса?


Sergey N   (2004-04-02 14:30:00) [14]

Игорь Шевченко ©   (02.04.04 12:58)
Спасибо! Попробую..


Игорь Шевченко   (2004-04-02 12:58:00) [15]

Sergey N ©   (02.04.04 12:49)

Да, конечно. Или происходит завершение сеанса пользователя.
Это можно отличить по Lparam сообщения WM_QUERYENDSESSION

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.)
If this parameter is zero, the system is shutting down.


Sergey N   (2004-04-02 12:49:00) [16]

Игорь Шевченко ©   (02.04.04 11:44)
Итак значит отлавливая WM_QUERYENDSESSION мы наверняка можем утверждать, что система будет сейчас перегружаться / выключаться?


Игорь Шевченко   (2004-04-02 11:44:00) [17]

Sergey N ©   (02.04.04 11:37)

Про Win9x ничего не знаю.


> И какие еще есть способы завершения работы?


Кнопки Reset или Power на корпусе компьютера.


> Что будет если послать WM_QUERYENDSESSION непосредственно
> WinLogon и Services.exe


Ничего не будет.
Сообщения CSRSS и сообщения Windows это две большие разницы.


Sergey N   (2004-04-02 11:37:00) [18]

to Игорь Шевченко Thxx!!! А если взять Win9x? И какие еще есть способы завершения работы? Что будет если послать WM_QUERYENDSESSION непосредственно WinLogon и Services.exe минуя вызов ExitWindowEx?


Игорь Шевченко   (2004-04-02 11:21:00) [19]


> Есть API ExitWindowEx(). Как она работает, какие сообщения
> посылает (если посылает)


На NT-системах:
Посылает сообщение подсистеме Win32 (CSRSS.EXE) о том, что надо закончить работу Windows. CSRSS оповещает WinLogon, который делает свои действия и опять вызывает ExitWindowEx. CSRSS видя, что запрос пришел от WinLogon, начинает закрывать процессы, рассылая им сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Если нужно завершить сеанс пользователя, управление возвращается в WinLogon с выводом приглашения зарегистрироваться в системе. Если нужно завершить работу Windows, то CSRSS оповещает процесс Services.exe, который закрывает сервисы, после этого вызывается ZwSystemShutdown, которая оповещает о завершении работы драйвера устройств, чтобы те могли подготовить устройства, после этого управление передается в HAL, который, собственно, и выключает либо перезагружает компьютер.


Wiz@rd   (2004-04-02 10:30:00) [20]

Она вызывается может и в процессе - но тогда этот процесс - ядро - фиг он тебе даст твою длл туда засунуть


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо