Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2012, 01:34   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Перехватить завершение ОС первее всех. Возможно ли?

Доброго времени суток!

Мне нужно перехватить этап подготовки к завершению работы(WM_QUERTYENDSESSION) ОС самым первым.

Данное сообщение рассылается окнам в порядке их очереди. Как стоять первым в этой очереди постоянно?

Может можно как-то ещё, первым, узнать о желании юезра завершить ОСь?

Последний раз редактировалось Человек_Борща; 20.07.2012 в 01:40.
Человек_Борща вне форума Ответить с цитированием
Старый 20.07.2012, 07:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хук делай на сообщения. Кто последний на хуке - тот первый получит уведомление.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.07.2012, 09:05   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Документированого способа нет
waleri вне форума Ответить с цитированием
Старый 20.07.2012, 10:32   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Stilet, нужные мне программы не должны получить это сообщение до меня.
А они могут стоятьи впереди и позади меня, первее чем я.
Человек_Борща вне форума Ответить с цитированием
Старый 20.07.2012, 10:48   #5
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Есть функция SetProcessShutdownParameters, но как будет себя вести система, если несколько приложений установят одинаковый Level - непонятно. Информации об этом я нигде не нашел.
volvo877 вне форума Ответить с цитированием
Старый 20.07.2012, 12:48   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Спасибо! Но с 1-м параметром не поняно. Мне нужно:
Цитата:
300-3FF Application reserved first shutdown range.

Мне нужно указать в HEX-варианте число?
Код:
GetProcessShutdownParameters($300,SHUTDOWN_NORETRY); //$300 <=> 0x300(c++)
Думаю, там конфликтов не будет т.к. система запускается на это уровне:
Цитата:
400-4FF System reserved first shutdown range.

Update
Разобрался, работает =)

Код:
procedure TMainForm.APMWinMsgHandler(var MSG: TWMQueryEndSession);
var
  i, i2: Integer;
begin
  if MSG.MSG = WM_QUERYENDSESSION then //< - нужно ли делать эту проверку?
  begin
    if RM.Enabled and UseRulesMgrChk.Checked then
    begin
      for i := 0 to RM.Count - 1 do
      begin
        if RM[i].flag_Kill then
        begin
          RM[i].Ignore := true;
          for i2 := 0 to RM[i].Targets.Count - 1 do
            RM[i].Targets[i2].Kill;
        end;
      end;
    end;
    MSG.Result := 1;
  end;
  // inherited; <=Нужно ли вызывать это? 
end;

Последний раз редактировалось Человек_Борща; 20.07.2012 в 13:10.
Человек_Борща вне форума Ответить с цитированием
Старый 20.07.2012, 13:04   #7
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Цитата:
Мне нужно указать в HEX-варианте число?
Если хочешь первым, кто получит уведомление - то указывай $3FF (или 1023, без разницы), потому как "The system shuts down processes from high dwLevel values to low" - чем выше dwLevel тем быстрее получаешь уведомление
volvo877 вне форума Ответить с цитированием
Старый 20.07.2012, 17:17   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

а по поводу дополнения можно что-нибудь сказать?
Человек_Борща вне форума Ответить с цитированием
Старый 20.07.2012, 17:35   #9
volvo877
Форумчанин
 
Аватар для volvo877
 
Регистрация: 01.06.2009
Сообщений: 108
По умолчанию

Проверку делать не надо, насколько я вижу из прототипа функции, она принимает TWMQueryEndSession, т.е., описана с "message WM_QUERYENDSESSION", и отработает только тогда, когда пришло именно это сообщение. Inherited я бы тоже оставил. Дефолтный обработчик в ответ на WM_QUERYENDSESSION возвращает True, так что хуже он не сделает.
volvo877 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Одновременное завершение всех параллельно работающих копий скриптов WennY PHP 13 11.03.2012 01:31
Возможно ли узнать количество всех внешних ссылок сайта? Dux Работа с сетью в Delphi 1 14.03.2011 17:46
Имена всех секций всех ini-файлов (DELPHI) Dj_SheLL Помощь студентам 7 10.10.2010 17:44
messageBox поверх всех окон, возможно ли? Kashp Win Api 13 28.02.2010 18:33
как перехватить открытие чужого приложенияпытаюсь перехватить открытие любого приложе rpy3uH Win Api 2 02.12.2006 12:12