Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Запретить выключение компа


Автор: mspuz 19.12.2005, 13:11
Мне нужно отследить, когда пользователь выберит пункт - "Завершение работы" и вместо этого ("Завершения работы") запустить программу резервного копирования, которая по окончанию сама вырубит комп - КАК?????

Автор: _hunter 19.12.2005, 13:38
по завершению смысла нет -- по истечению срока, отпущенного на завершение работа сыстема выведет диалог с запросом на убийство программы, тормозящей процес...

Автор: mspuz 19.12.2005, 13:55
_hunter Тоесть по завершению сделать нельзя?????

Автор: _hunter 19.12.2005, 14:21
почему нельзя? -- можно. только смысла нет.

Автор: azesmcar 19.12.2005, 14:27
Еще как можно smile

Перехватываешь WM_QUERYENDSESSION и отвечаешь на него вместо своей программы что ты занят очень важной работой и сам дашь знать когда закончишь smile Примерно так на словах...

Цитата
If any application returns zero, the session is not ended. The system stops sending WM_QUERYENDSESSION messages as soon as one application returns zero.


http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/wm_queryendsession.asp

Автор: Poseidon 19.12.2005, 22:40
Код

  private
    procedure WMQueryEndSession(var Message: TWMQueryEndSession); message WM_QUERYENDSESSION;

{...}

function SetPrivilege(PrivilegeName: String; AEnabled: Boolean): Boolean;
var
  TPPrev, TP: TTokenPrivileges;
  Token: THandle;
  dwRetLen: DWORD;
begin
  Result := False;
  if OpenProcessToken(GetCurrentProcess,
    TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
  try
    if LookupPrivilegeValue(nil, PChar(PrivilegeName),TP.Privileges[0].LUID) then
    begin
      TP.PrivilegeCount := 1;
      if AEnabled then
        TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
      else
        TP.Privileges[0].Attributes := 0;
      dwRetLen := 0;
      Result := AdjustTokenPrivileges(Token, False, TP,
        SizeOf(TPPrev), TPPrev, dwRetLen);
    end;
  finally
    CloseHandle(Token);
  end
  else
    RaiseLastOSError;
end;

procedure TForm1.FormCreate(Sender: TObject);
const
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
  if not SetPrivilege(SE_SHUTDOWN_NAME, True) then
    RaiseLastOSError;
end;

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);
begin
  inherited;
  Message.Result := 0;
  AbortSystemShutdown(nil);

  // тут делаешь свое резервное копирование

   InitiateSystemShutdown(nil, nil, 0, True, False); // вырубаешь винду

end;


Скажу честно, постил "вслепую" (т.е. код не проверял), поэтому могут быть мелкие очепятки.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)