Форум: "Система";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
ВнизКак сделать Hook на выключение компьютера Найти похожие ветки
← →
Sergey N © (2004-04-01 11:46) [0]Доброе время суток!
Задача: Создать программку, перехватывающую сообщение о выключении/перезагрузке машины и в зависимости от решения пользователя либо продолжить данную операцию, либо просто ее игнорировать.
Понимаю, что это делается с помощью SetWindowsHookEx, но не знаю как ее применить. Либо подменять функцию ExitWindow, или вешаться на какое-то сообщение.. Как подойти?
Может есть скелет программы у кого?
Спасибо все отреагировавшим!
← →
VMcL © (2004-04-01 15:54) [1]см. GINA @ http://msdn.microsoft.com/
← →
Sergey N © (2004-04-01 16:55) [2]Спасибо за совет.. Если бы смог по нему разобраться, то и не обращался бы..
← →
BiN © (2004-04-01 17:03) [3]Понимаю, что это делается с помощью SetWindowsHookEx, но не знаю как ее применить
На этом сайте есть статья на эту тему
← →
sir John © (2004-04-01 17:15) [4]Может быть это поможет? Для того, чтобы определить выключение/перезагрузку ОС можно ловить WM_EndSession сообщение
type
TForm1 = class(TForm)
private
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
public
end;
implementation
{$R *.DFM}
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
if Msg.EndSession = True then
ShowMessage("Windows is shutting down!");
inherited;
end;
← →
Wiz@rd © (2004-04-01 18:31) [5]Ето не спасёт даже от такой ламеской вещи как EWX_FORCE, не говоря уж об NtSystemShutdown, или тем более о записи в регистры из Ring0
← →
VMcL © (2004-04-01 18:36) [6]2 [4]
WM_QUERYENDSESSION, а не WM_ENDSESSION. И то см. [5].
← →
Alexander666 © (2004-04-01 19:06) [7]Собственно, можно перехватить функцию NtSystemShutdown
← →
Wiz@rd © (2004-04-01 23:45) [8]У решета все дыры не закроешь
← →
Sergey N © (2004-04-02 08:21) [9]to sir John: Если я не ошибаюсь, то ето нельзя сделать в экзешнике, нуно внедрять DLL в другие адрессные пространства..
to all: Может тогда по порядку начнем? Есть API ExitWindowEx(). Как она работает, какие сообщения посылает (если посылает), и как ее перехватить, если она вызывается в каком-то процессе в системе?
← →
Wiz@rd © (2004-04-02 10:30) [10]Она вызывается может и в процессе - но тогда этот процесс - ядро - фиг он тебе даст твою длл туда засунуть
← →
Игорь Шевченко © (2004-04-02 11:21) [11]
> Есть API ExitWindowEx(). Как она работает, какие сообщения
> посылает (если посылает)
На NT-системах:
Посылает сообщение подсистеме Win32 (CSRSS.EXE) о том, что надо закончить работу Windows. CSRSS оповещает WinLogon, который делает свои действия и опять вызывает ExitWindowEx. CSRSS видя, что запрос пришел от WinLogon, начинает закрывать процессы, рассылая им сообщения WM_QUERYENDSESSION и WM_ENDSESSION. Если нужно завершить сеанс пользователя, управление возвращается в WinLogon с выводом приглашения зарегистрироваться в системе. Если нужно завершить работу Windows, то CSRSS оповещает процесс Services.exe, который закрывает сервисы, после этого вызывается ZwSystemShutdown, которая оповещает о завершении работы драйвера устройств, чтобы те могли подготовить устройства, после этого управление передается в HAL, который, собственно, и выключает либо перезагружает компьютер.
← →
Sergey N © (2004-04-02 11:37) [12]to Игорь Шевченко Thxx!!! А если взять Win9x? И какие еще есть способы завершения работы? Что будет если послать WM_QUERYENDSESSION непосредственно WinLogon и Services.exe минуя вызов ExitWindowEx?
← →
Игорь Шевченко © (2004-04-02 11:44) [13]Sergey N © (02.04.04 11:37)
Про Win9x ничего не знаю.
> И какие еще есть способы завершения работы?
Кнопки Reset или Power на корпусе компьютера.
> Что будет если послать WM_QUERYENDSESSION непосредственно
> WinLogon и Services.exe
Ничего не будет.
Сообщения CSRSS и сообщения Windows это две большие разницы.
← →
Sergey N © (2004-04-02 12:49) [14]Игорь Шевченко © (02.04.04 11:44)
Итак значит отлавливая WM_QUERYENDSESSION мы наверняка можем утверждать, что система будет сейчас перегружаться / выключаться?
← →
Игорь Шевченко © (2004-04-02 12:58) [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 14:30) [16]Игорь Шевченко © (02.04.04 12:58)
Спасибо! Попробую..
← →
Sergey N © (2004-04-02 15:08) [17]Вот, перехватываю все WM_QUERYENDSESSION. Чтобы продолжить перезагрузку я должен просто протолкнуть их дальше. Что нужно сделать, чтобы погасить перезагрузку/выключение/завершение сеанса?
← →
Игорь Шевченко © (2004-04-02 15:22) [18]Sergey N © (02.04.04 15:08)
> Что нужно сделать, чтобы погасить перезагрузку/выключение/завершение
> сеанса?
F1 почитать, наверное, про сообщение WM_QUERYENDSESSION
← →
Sergey N © (2004-04-02 15:50) [19]Игорь Шевченко © (02.04.04 15:22)
Т.е. предполагается, что приложение может сказать системе что-нибудь типа: "Я сейчас не хочу заканчивать работу, давай подождем часок-другой."? И система ответит: "Хорошо, давай, пошлю сообщение через час, а пока закрою другие приложения.".? Что-то не верится.
← →
Cobalt © (2004-04-02 19:33) [20]2 Sergey N © (02.04.04 15:50) [19]
Не верить документации не имея на руках вопиющих фактов - глупо.
← →
Taur © (2004-04-18 10:07) [21]Привет всем!
Sergey N, удалось ли написать подобную прогу?
При перехвате сообщения WM_QUERYENDSESSION, все другие проги закрываются, как бы и этого избежать? Хотелось бы, чтобы оключение попросту игнорировался!!!
← →
Anatoly Podgoretsky © (2004-04-18 11:47) [22]Последствия противодействия выключению системы могут быть просто ужасны. Например при пропаданиия питаний капут базе, файловой системе. За внедрение таких методов в программу надо просто растреливать.
← →
Taur © (2004-04-18 15:54) [23]Anatoly Podgoretsky
От пропадания питания никто не застрахован, если конечно нет бесперебойника!!! Прога нужна для дома, поскольку маленький сынишка периодически подходит и жмет кнопку Power на корпусе!!! И от этого бывают далеко не самые лучшие последствия :)! А комп на потолок вешать ,да и физически кнопку отрубать не охота,!
← →
Polevi © (2004-04-18 20:56) [24]> [23] Taur © (18.04.04 15:54)
бесперобойник умеет выключать компьютер если у него заканчитается "топливо"
если помешать ему сделать это - см. [22]
← →
nikkie © (2004-04-18 21:05) [25]>маленький сынишка периодически подходит и жмет кнопку Power
тык нет проблем - ловишь WM_QUERYENDSESSION и кнопка Power и не нажимается уже... :)
а если серьезно, лучшее решение проблем - надавать ему по заднице, чтобы не нажимал. к печке, утюгам и т.п. он у вас не лезет?
← →
Taur © (2004-04-19 14:52) [26]nikkie
Так ведь "При перехвате сообщения WM_QUERYENDSESSION, все другие проги закрываются", или я что-то не так делаю
← →
YDV (2004-04-19 15:44) [27]1. на рабочем столе кликаем правой кнопкой мыши
2. переходим на закладку заставка
3. Энергосбережение -> Питание
4. переходим на закладку дополнительно
5. кнопки питания
5. при нажатии кнопки выключения питания -> действие не требуется и кнопка перестанет работать
Но все же интересно как перехватить только нажатие кнопки power, и так что бы другие приложения не закрывались ... интересная задача.
← →
Anatoly Podgoretsky © (2004-04-19 15:58) [28]Taur © (18.04.04 15:54) [23]
Речь именно про бесперебойник, если этому делу препятствовать, то сказали топливо кончится.
Про управление кнопкой питания тебе сказали, но это не поможет против ресета или длительного удержания кнопки. А вот физически отключить обе эти кнопки стоит, при этом желательно что бы блок питания имел свою кнопку отключения.
← →
Anatoly Podgoretsky © (2004-04-19 15:59) [29]Да я обычно выключаю компьютер именно этой кнопкой, а меню установлено на перезагрузку, так мне удобнее.
Естественно без разрушения, штатное выключение.
А вот в серверах кнопки отключены, что бы уборщица случайно не нажала.
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.052 c