Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.035 c
1-1083763502
denis_group
2004-05-05 17:25
2004.05.23
CheckBox ы в StringGrid .


1-1084150584
Алекс А
2004-05-10 04:56
2004.05.23
Как работать с кардиналами ?


1-1083748602
Романов Р.В.
2004-05-05 13:16
2004.05.23
Организация вывода сообщения об ошибке


1-1082922779
Shopot
2004-04-25 23:52
2004.05.23
Form1.VertScrollBar.


14-1083312818
Sour
2004-04-30 12:13
2004.05.23
XML+XSD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский