Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

Как сделать 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.03 c
3-1082986711
VEN
2004-04-26 17:38
2004.05.23
Конвертация таблицы dbase III+ в Visual dBASE7


9-1074104612
Bortel
2004-01-14 21:23
2004.05.23
Помогите с первой игрой


3-1083207788
Нуждающийся
2004-04-29 07:03
2004.05.23
Как получить значение тригера при вставке(FireBird)


6-1080642779
vinter
2004-03-30 14:32
2004.05.23
Как получить список доменов


6-1080949188
-M13-
2004-04-03 03:39
2004.05.23
VPN соединение