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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2013, 06:49   #1
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
Сообщение хук на выключение, перезагрузку, спящий режим и логоут

почему у меня не работает этот хук на выключение, перезагрузку, спящий режим и логоут? Проверьте, у кого работает, у меня не работает
Код:
procedure SystemShutdown(const ATimeOut: DWORD; const AForceClose, AReboot: boolean);
var
   PreviosPrivileges: ^TTokenPrivileges;
   TokenPrivileges: TTokenPrivileges;
   hToken: THandle;
   tmpReturnLength: dword;
begin
	  if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
	    if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
	    begin
	      LookupPrivilegeValue(nil, 'SeShutdownPrivilege', TokenPrivileges.Privileges[0].Luid);
	      TokenPrivileges.PrivilegeCount := 1;
	      TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
	      tmpReturnLength := 0;
	      PreviosPrivileges := nil;
	      AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
	      if InitiateSystemShutdown(nil, nil, ATimeOut, AForceClose, AReboot) then
	      begin
	        TokenPrivileges.Privileges[0].Attributes := 0;
	        AdjustTokenPrivileges(hToken, False, TokenPrivileges, 0, PreviosPrivileges^, tmpReturnLength);
	      end;
	    end;
	  end
	  else
	    ExitWindowsEx(EWX_FORCE or EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
или вот ещё функция:
Код:
function ShutdownPC: Boolean;
var
  TTokenHd: THandle;
  TTokenPvg: TTokenPrivileges;
  cbtpPrevious: DWORD;
  rTTokenPvg: TTokenPrivileges;
  pcbtpPreviousRequired: DWORD;
  tpResult: Boolean;
  RebootParam: Longword;
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  RebootParam := EWX_POWEROFF or EWX_FORCE;
  if Win32Platform = VER_PLATFORM_WIN32_NT then
  begin
    tpResult := OpenProcessToken(GetCurrentProcess(),
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      TTokenHd);
    if tpResult then
    begin
      tpResult := LookupPrivilegeValue(nil,
                                       SE_SHUTDOWN_NAME,
                                       TTokenPvg.Privileges[0].Luid);
      TTokenPvg.PrivilegeCount := 1;
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
      cbtpPrevious := SizeOf(rTTokenPvg);
      pcbtpPreviousRequired := 0;
      if tpResult then
        Windows.AdjustTokenPrivileges(TTokenHd,
                                      False,
                                      TTokenPvg,
                                      cbtpPrevious,
                                      rTTokenPvg,
                                      pcbtpPreviousRequired);
    end;
  end;
  Result := ExitWindowsEx(RebootParam, 0);
end;
или вот, но это не то, это хук на диалог завершения:

Код:
function TForm1.HookEndSession(var Message: TMessage): Boolean;
begin
  result := false;
  if Message.Msg = WM_ENDSESSION then begin
    Message.Result := 0;
    result := true;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.HookMainWindow(HookEndSession);
end;
а это сама процедура выключения :
Код:
procedure PowerOFF_PC;
var
  ph: THandle;
  tp, prevst: TTokenPrivileges;
  rl: DWORD;
begin
  OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, ph);
  LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);
  tp.PrivilegeCount := 1;
  tp.Privileges[0].Attributes := 2;
  AdjustTokenPrivileges(ph, FALSE, tp, SizeOf(prevst), prevst, rl);
  ExitWindowsEx(EWX_SHUTDOWN or EWX_POWEROFF, 0);
end;
а это на спящий режим:
Код:
procedure SleepPC;
var
  hToken: THandle;
  tkp: TTokenPrivileges;
  ReturnLength: Cardinal;
begin
  if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or
    TOKEN_QUERY, hToken) then
  begin
    LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid);
    tkp.PrivilegeCount := 1; // one privelege to set
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    if AdjustTokenPrivileges(hToken, False, tkp, 0, nil, ReturnLength) then
      SetSystemPowerState(true, true);
  end;
end;
мне надо прервать это действие,например, для программы AIMP3 или AIMP2 AutoShutDown
как правильно записать, или напишите пример

Последний раз редактировалось beegl; 04.05.2013 в 07:56. Причина: добавил код
beegl вне форума Ответить с цитированием
Старый 04.05.2013, 08:45   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

чтото не замечаю тут хука
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.05.2013, 08:47   #3
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
чтото не замечаю тут хука
мне надо не хук, а прерывание выключения ПК другими программами,программно, например программы AIMP2-AIMP3
beegl вне форума Ответить с цитированием
Старый 04.05.2013, 09:04   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вариант сплайсить нужную функцию у целевой программы.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.05.2013, 09:16   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

не не, просто прервать цикл WM_* сообщения которое идет по всем окнам и сообщает что надо закрываться.
Человек_Борща вне форума Ответить с цитированием
Старый 04.05.2013, 09:17   #6
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

Человек_Борща, напишите пример, и чтоб он ничего лишнего не перехвачивал
beegl вне форума Ответить с цитированием
Старый 04.05.2013, 10:32   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
не не, просто прервать цикл WM_* сообщения которое идет по всем окнам и сообщает что надо закрываться.
часть сообщений начнут уже закрыватся.
хотя можно попробовать сыграть на порядке сообщения(помню есть такая функция).
чтото не пришло в голову, только это перехват выключения вообще.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.05.2013, 11:21   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://www.programmersforum.ru/showthread.php?t=168613
Подходит идея?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.05.2013, 11:44   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

beegl,
Цитата:
Человек_Борща, напишите пример, и чтоб он ничего лишнего не перехвачивал
Вы наглый. Сами пишите.
Цитата:
часть сообщений начнут уже закрыватся.
Неа, если стать первым в очереди =) В своей программе это я реализовал через SetProcessShutdownParameters
+/- пару нюансов с запуском, чтобы точно первым получить 0x3ff для себя.

Последний раз редактировалось Человек_Борща; 04.05.2013 в 11:48.
Человек_Борща вне форума Ответить с цитированием
Старый 04.05.2013, 12:03   #10
beegl
instagram
Участник клуба
 
Аватар для beegl
 
Регистрация: 24.05.2008
Сообщений: 1,451
По умолчанию

что-то ничего не получается, уже все способы испробовал, постоянно выключается комп, оформите пожалуйста проект, и прикрепите сюда. Буду премного благодарен

это тоже не прерывает
Код:
public
     IsWindowsEndSession: Boolean;
     procedure WindowsEndSessionHook(var msg: TMessage); message WM_QUERYENDSESSION;
    { Public declarations }
end;



procedure TForm1.WindowsEndSessionHook(var msg: TMessage);
begin
  if msg.WParam = WM_QUERYENDSESSION then
begin
        IsWindowsEndSession := True;
  end;
  inherited;
end;

Последний раз редактировалось beegl; 04.05.2013 в 13:33. Причина: добавил код
beegl вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запретить уход в спящий режим mutabor Общие вопросы Delphi 1 21.03.2011 04:41
спящий режим в виндовс 7 west777 Помощь студентам 1 23.02.2011 12:53
Тормозит спящий режим Arigato Операционные системы общие вопросы 28 31.10.2010 11:27
Спящий режим на ноутбуке stenl1 Компьютерное железо 2 23.03.2010 16:22
программно отключить спящий режим furstenberg Win Api 0 18.01.2009 17:52