Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
ВнизВыключить комп Найти похожие ветки
← →
Weiss © (2005-10-04 16:37) [0]Как програмно выключить комп?
← →
stone © (2005-10-04 16:38) [1]http://web.avtosklad.info/psites/ovainsh/prog_misc.asp
← →
syte_ser78 © (2005-10-04 16:43) [2]shutdown
← →
Profik © (2005-10-04 16:43) [3]Выключить монитор - это классно, но можно сделать ещё круче - программно завершить работу компьютера. Выглядеть это будет примерно так, с использованием различных режимов выключения:
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
← →
Profik © (2005-10-04 16:46) [4]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;
← →
Profik © (2005-10-04 16:48) [5]Программа для выключения компьютера в заданное время. Если запустить с параметром, указав время, то программа запустится скрытно и выключит компьютер в указанное время. Проверенно на 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;
← →
Hamster © (2005-10-04 19:02) [6]shutdown.exe -s -t 0
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.12.04;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.076 c