Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выключить комп


Weiss ©   (2005-10-04 16:37:00) 

Как програмно выключить комп?


Hamster   (2005-10-04 19:02:00) [1]

shutdown.exe -s -t 0


Profik   (2005-10-04 16:48:00) [2]

Программа для выключения компьютера в заданное время. Если запустить с параметром, указав время, то программа запустится скрытно и выключит компьютер в указанное время. Проверенно на Windows XP.

Для выключения используется процедура:
procedure ShutdownComputer;
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;


Profik   (2005-10-04 16:46:00) [3]

function GetWinVersion: string;
var
 VersionInfo: TOSVersionInfo;
 OSName: string;
begin
 // устанавливаем размер записи
 VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );
 if Windows.GetVersionEx( VersionInfo ) then
 begin
   with VersionInfo do
   begin
     case dwPlatformId of
       VER_PLATFORM_WIN32s: OSName := 'Win32s';
       VER_PLATFORM_WIN32_WINDOWS: OSName := 'Windows 95';
       VER_PLATFORM_WIN32_NT: OSName := 'Windows NT';
     end; // case dwPlatformId
     Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +
     #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';
   end; // with VersionInfo
 end // if GetVersionEx
 else
 Result := '';
end;

procedure ShutDown;
const
 SE_SHUTDOWN_NAME = 'SeShutdownPrivilege'; // Borland forgot this declaration
var
 hToken: THandle;
 tkp: TTokenPrivileges;
 tkpo: TTokenPrivileges;
 zero: DWORD;
begin
 if Pos('Windows NT', GetWinVersion) = 1 then // we've got to do a whole buch of things
 begin
   zero := 0;
   if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
   begin
     MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
     Exit;
   end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

   if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
   begin
     MessageBox(0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK);
     Exit;
   end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)

   // SE_SHUTDOWN_NAME
   if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) then
   begin
     MessageBox(0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK);
     Exit;
   end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )

   tkp.PrivilegeCount := 1;
   tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

   AdjustTokenPrivileges(hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero);
   if Boolean(GetLastError()) then
   begin
     MessageBox(0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK);
     Exit;
   end // if Boolean( GetLastError() )
   else
     ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );

 end // if OSVersion = 'Windows NT'
 else
 begin // just shut the machine down
   ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );
 end; // else
end;


syte_ser78   (2005-10-04 16:43:00) [4]

shutdown


Profik   (2005-10-04 16:43:00) [5]

Выключить монитор - это классно, но можно сделать ещё круче - программно завершить работу компьютера. Выглядеть это будет примерно так, с использованием различных режимов выключения:

ExitWindowsEx(EWX_LOGOFF or ewx_force,0);



завершает работу всех запущенных в системе процессов, сохраняя данные приложения, вызвавшего эту функцию

ExitWindowsEx(EWX_SHUTDOWN or ewx_force,0);



останавливает работу системы в безопасный момент времени. Все буферы очищаются с сохранением данных на диске, все процессы останавливаются

ExitWindowsEx(EWX_REBOOT or ewx_force,0);



перезагрузка системы

ExitWindowsEx(EWX_FORCE or ewx_force,0);



завершает работу всех запущенных в системе приложений, не посылая им сообщения WM_QUERYENDSESSION и WM_ENDSESSIO. Это может вызвать потерю не сохраненных данных

ExitWindowsEx(EWX_POWEROFF or ewx_force,0);



завершает работу компьютера с выключением питания, если система поддерживает автоуправление питанием

ExitWindowsEx(EWX_FORCEIFHUNG or ewx_force,0);



завершает работу всех запущенных в системе приложений если система висит

Ещё вариант перезагрузки:

mov  al,0F0h  
out  64h,al


stone   (2005-10-04 16:38:00) [6]

http://web.avtosklad.info/psites/ovainsh/prog_misc.asp


Наверх

Титульная страница Поиск, карта сайта Написать письмо