![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать Hook на выключение компьютера [D5, D6, Win95/98, NT4, Win2k, WinXP]
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]Она вызывается может и в процессе - но тогда этот процесс - ядро - фиг он тебе даст твою длл туда засунуть