Delphi выключить компьютер windows 10

Обновлено: 07.07.2024

Я провел небольшое исследование, и вот что я выяснил:

При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:

1. FormCloseQuery – действие по умолчанию, устанавливает переменную CanClose в значание TRUE и продолжает закрытие формы.

Если приложение активно и вы пытаетесь завершить работу Windows (Shut Down), происходят следующие события (с соблюдением последовательности):

Мы видим, что метод FormClose в этом случае не вызывается.

Теперь воспроизведем всю последовательность событий, происходящую при попытке завершить работу Windows:

5. Завершение работы Windows.

uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs;

type TForm1 = class(TForm)

procedure FormClose(Sender: TObject; var Action: TCloseAction);

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

var Form1: TForm1;

procedure TForm1.WMQueryEndSession(var Message: TWMQueryEndSession);

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

Я не тестировал этот код, но могу предположить, что он должен работать. Сообщите, если это не так!

Глава 2 Запуск и завершение работы

Глава 2 Запуск и завершение работы • Выбор способа входа в систему• Трюки с экранами загрузки и приветствия• Ускорение загрузки Windows• Ярлыки для быстрого выхода из системы и завершения

2.7. Завершение работы операционной системы

2.7. Завершение работы операционной системы Очень важно правильно завершить работу операционной системы. Не забывайте, что нельзя просто выключить питание или нажать «Reset». Неправильное завершение работы операционной системы может вызвать потерю данных на диске или, в

Завершение работы

Завершение работы Выключить компьютер можно двумя способами• Используя команду Завершение работы меню кнопки Пуск• Открывая окно Завершение работы программы нажатием кнопок ctrl+alt+del и нажимая кнопку Завершить работуWindows позволяет запретить выключение этими способами

Завершение работы

Завершение работы Выключить компьютер можно двумя способами - Используя команду Выключение меню кнопки Пуск- Открывая окно Диспетчер задач Windows нажатием кнопок Ctrl+Alt+Del и выбирая пункт меню Завершение работы | Выключение Windows позволяет запретить выключение этими

Быстрое завершение работы Windows

2.12. Завершение работы с файлом

2.12. Завершение работы с файлом В версии текстового редактора Word 2007 появилась новая функция – завершение работы с файлом. Выбрав в меню кнопки Office пункт Подготовить, вы получите доступ к операциям, которые разработчики предлагают выполнить перед тем как документ станет

Сохранение и завершение работы

Сохранение и завершение работы Для сохранения документа нажмите кнопку Save (Сохранить) на панели быстрого доступа либо на панели инструментов Standard (Стандартная). Можно также выполнить команду меню File ? Save (Файл ? Сохранить). На экране появится диалоговое окно Save Drawing As

1.3. Завершение работы в Microsoft Word

1.3. Завершение работы в Microsoft Word Окно программы Microsoft Word имеет те же элементы, что и другие окна в операционной системе Windows, поэтому завершать работу с программой вы можете привычными способами. Существует несколько вариантов закрытия программы:• нажать кнопку Office,

Завершение работы Windows

Завершение работы Windows События, происходящие в приложениях Delphi при завершении работы Windows Я провел небольшое исследование, и вот что я выяснил:При закрытии приложения (используя системное меню или вызывая метод закрытия формы), возникают следующие события:1. FormCloseQuery –

2.4. Начало работы и ее завершение

Сохранение и завершение работы

Сохранение и завершение работы Для сохранения документа нажмите кнопку Save (Сохранить) на панели быстрого доступа либо на панели инструментов Standard (Стандартная). Можно также выполнить команду меню File ? Save (Файл ? Сохранить). На экране появится диалоговое окно Save Drawing As

3.4. Завершение работы системы

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

4.2. Начало и завершение работы

4.2. Начало и завершение работы Для работы в Windows 2000 необходимо иметь учетную запись, состоящую из имени пользователя и пароля. Учетная запись пользователя создается администратором. Затем ей назначаются разрешения, определяющие возможность доступа к файлам, папкам и

7.2. Правильное завершение работы в Интернете

7.2. Правильное завершение работы в Интернете Для правильного завершения работы в Интернете (все равно, какой тип подключения вы используете — модемное, ADSL или GPRS) нужно щелкнуть правой кнопкой мыши по индикатору соединения и выбрать команду Отключиться от. После этого

Завершение работы

Завершение работы Для завершения работы с компьютером под управлением Windows Vista по умолчанию предлагается совершенно новый способ – переход в режим сна. Для перевода компьютера в этот режим щелкните на кнопках Пуск, а затем Выключение. В результате текущий сеанс работы

Выключение перезагрузка
Как сделать выключение и перезагрузку с завершением всех программ Чтобы не выскакиволо это.

Выключение программы
Добрый день. Есть программа, с помощью которой операционисты подключаются к телефонной станции.

выключение компьютера
Подскажите пожалуйста как сделать выключение компьютера после завершении работы программы? Тоесть .

Выключение компа.
Подскажите, что надо написать в обработчике событий OnClick, чтобы при нажатии на кнопку вырубался.

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

Gudzik11, ЩАс проверю!

Добавлено через 2 минуты
Вот держи!

Всё выключяеться но Windows просит закрыть все открытые приложения , а мне надо чтоб он их сам все закрывал принудительно . Так можно зделать ? Всё выключяеться но Windows просит закрыть все открытые приложения , а мне надо чтоб он их сам все закрывал принудительно . Так можно зделать ? Вот типа тоже , выключает мгновенно(не советую) - как из розетки , я не пробовал!
Добавлено через 2 минуты
Всё-таки пробовал , работает! очень даже эффективно .
Интересно это вредно для компа ? очень даже эффективно .
Интересно это вредно для компа ? Что за вопрос , конечно да , я выше не зря написал что не советую!
Я не могу конкретно обяснить как он выключаеться но думаю он отключает питание. Это чтото вроде выдернуть из розетки!


Выключение ПК программно
Тут вот такая штука. мне нужно собрать воедино куски одной простенькой задачки. Задумка вот.

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

Время выключение компьютера
Нашел на мсдн GetSystemMetrics(SM_SHUTTINGDOWN). Решил попробовать. Но что-то пошло не так. .

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Выключение компьютера или его перезагрузка осуществляется функцией ExitWindowsEx, объявленной в модуле Windows следующим образом:

Параметр dwReserved не используется, а параметр uFlags может содержать следующие флаги, управляющие процессом выключения компьютера.

Форсировать выключение компьютера. Если задан этот

ENDSESSION и WM_ENDSESSION выполняющимся при-

ложениям. Следовательно, эти приложения не смогут сде-

лать запросов пользователю о сохранении данных и могут

потерять последние изменения документов, с которыми

они работали. Так что использовать этот флаг надо очень

осторожно, только в каких-то аварийных ситуациях.

Сменить пользователя. Завершаются все процессы данного

пользователя, и осуществляется переход в окно Windows

Выключить компьютер и его систему питания, если компьютер поддерживает эту возможность. В Windows 95 этот флаг срабатывает всегда, а в Windows NT/2000/XP только в случае, если данный процесс имеет привилегию SE_SHUTDOWN_NAME.

Перезагрузить систему. В Windows 95 этот флаг срабатывает всегда, а в Windows NT/2000/XP только в случае, если данный процесс имеет привилегию SEJSHUTDOWNJ4AME.

Выключить компьютер, но не выключать питание. Все процессы завершаются нормальным образом. Если в них при завершении предусмотрены запросы о сохранении данных, они выполняются. Из всех буферов файлов информация сохраняется на дисках. В Windows 95 этот флаг срабатывает всегда, а в Windows NT/2000/XP только в случае, если данный процесс имеет привилегию SE SHUTDOWN NAME.

Функция ExitWindowsEx возвращает 0 при успешном окончании вызова и возвращается, не дожидаясь окончания выключения системы.

Приведем пример. Следующий оператор завершает выполнение всех приложений данного пользователя и осуществляется переход в окно Windows смены пользователя:

Смена пользователя - единственный режим, не требующий особых привилегий. Все остальные режимы не будут выполняться, если приложение не имеет соответствующих привилегий. Например, оператор

function MyExitWindows(RebootParam: Longword): Boolean;

SE_SHUTDOWN_ NAME = 'SeShutdownPrivilege' ;

if Win32Platform = VER_PLATFORM_WIN32_NT then

TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,

if tpResult then

tpResult := LookupPrivilegeValue( nil ,

TTokenPvg.Privileges[ 0 ].Luid);

TTokenPvg.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;

if tpResult then

Result := ExitWindowsEx(RebootParam, 0 );

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);

MyExitWindows(EWX_POWEROFF or EWX_FORCE);

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);

MyExitWindows(EWX_REBOOT or EWX_FORCE);

// Parameters for MyExitWindows()

// (c) NeuralAbyss Software

logoff: Boolean = False;

reboot: Boolean = False;

warn: Boolean = False;

downQuick: Boolean = False;

cancelShutdown: Boolean = False;

powerOff: Boolean = False;

timeDelay: Integer = 0 ;

function HasParam(Opt: Char): Boolean;

for x := 1 to ParamCount do

if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;

function GetErrorstring: string ;

err: array [ 0 .. 512 ] of Char;

FormatMessage(FORMAT_ MESSAGE _FROM_SYSTEM, nil , lz, 0 , @err, 512 , nil );

Result := string (err);

rl, flgs: Cardinal;

if downQuick then flgs := flgs or EWX_FORCE;

if not reboot then flgs := flgs or EWX_SHUTDOWN;

if reboot then flgs := flgs or EWX_REBOOT;

if poweroff and ( not reboot) then flgs := flgs or EWX_POWEROFF;

if logoff then flgs := (flgs and ( not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or

if Win32Platform = VER_PLATFORM_WIN32_NT then

if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,

Writeln( 'Cannot open process token. [' + GetErrorstring + ']' )

if LookupPrivilegeValue( nil , 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid) then

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

AdjustTokenPrivileges(hToken, False, tkp, 0 , nil , rl);

if GetLastError <> ERROR_SUCCESS then

Writeln( 'Error adjusting process privileges.' );

Writeln( 'Cannot find privilege value. [' + GetErrorstring + ']' );

if AbortSystemShutdown(nil) = False then

Writeln(\'Cannot abort. [\' + GetErrorstring + \']\')

if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then

Writeln(\'Cannot go down. [\' + GetErrorstring + \']\')

Writeln( 'Shutdown v0.3 for Win32 (similar to the Linux version)' );

Writeln( '(c) 2000 NeuralAbyss Software. All Rights Reserved.' );

if HasParam( '?' ) or (ParamCount = 0 ) then

Writeln( 'Usage: shutdown [-akrhfnc] [-t secs]' );

Writeln( ' -k: dont really shutdown, only warn.' );

Writeln( ' -r: reboot after shutdown.' );

Writeln( ' -h: halt after shutdown.' );

Writeln( ' -p: power off after shutdown' );

Writeln( ' -l: log off only' );

Writeln( ' -n: kill apps that dont want to die.' );

Writeln( ' -c: cancel a running shutdown.' );

if HasParam( 'k' ) then warn := True;

if HasParam( 'r' ) then reboot := True;

if HasParam( 'h' ) and reboot then

Writeln( 'Error: Cannot specify -r and -h parameters together!' );

if HasParam( 'h' ) then reboot := False;

if HasParam( 'n' ) then downQuick := True;

if HasParam( 'c' ) then cancelShutdown := True;

if HasParam( 'p' ) then powerOff := True;

if HasParam( 'l' ) then logoff := True;

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

Сообщество программистов
Общение, помощь, обмен опытом

Другие разделы портала

Переход к вопросу:

Статистика за сегодня:

Вопросы: 0
Ответы: 0
Мини-форумы: 0

Лучшие эксперты

Здравствуйте, Гадлевский Олег Вячеславович!
Функция ExitWindows(), параметры смотрите в справке, там все детально описано.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 7 июля 2007, 12:40
Оценка за ответ: 5

Для выключения/перезагрузки - функция ExitWindowsEx().
Для перехода в спящий режим - функция SetSystemPowerState().

В DelphiWorld есть примеры использования обеих этих функций.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 9 июля 2007, 08:48
Оценка за ответ: 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);

ExitWindowsEx(EWX_POWEROFF or ewx_force,0);


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

ExitWindowsEx(EWX_FORCEIFHUNG or ewx_force,0);


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

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

mov al,0F0h
out 64h,al

function MyExitWindows(RebootParam: Longword): Boolean;
var
TTokenHd: THandle;
TTokenPvg: TTokenPrivileges;
cbtpPrevious: DWORD;
rTTokenPvg: TTokenPrivileges;
pcbtpPreviousRequired: DWORD;
tpResult: Boolean;
const
SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';
begin
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;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;


// Parameters for MyExitWindows()

uses
SysUtils,
Windows;

var
logoff: Boolean = False;
reboot: Boolean = False;
warn: Boolean = False;
downQuick: Boolean = False;
cancelShutdown: Boolean = False;
powerOff: Boolean = False;
timeDelay: Integer = 0;

function HasParam(Opt: Char): Boolean;
var
x: Integer;
begin
Result := False;
for x := 1 to ParamCount do
if (ParamStr(x) = '-' + opt) or (ParamStr(x) = '/' + opt) then Result := True;
end;

function GetErrorstring: string;
var
lz: Cardinal;
err: array[0..512] of Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
Result := string(err);
end;

procedure DoShutdown;
var
rl, flgs: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
flgs := 0;
if downQuick then flgs := flgs or EWX_FORCE;
if not reboot then flgs := flgs or EWX_SHUTDOWN;
if reboot then flgs := flgs or EWX_REBOOT;
if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;
if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or
EWX_LOGOFF;
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
hToken) then
Writeln('Cannot open process token. [' + GetErrorstring + ']')
else
begin
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
if GetLastError <> ERROR_SUCCESS then
Writeln('Error adjusting process privileges.');
end
else
Writeln('Cannot find privilege value. [' + GetErrorstring + ']');
end;
< if CancelShutdown then
if AbortSystemShutdown(nil) = False then
Writeln(\'Cannot abort. [\' + GetErrorstring + \']\')
else
Writeln(\'Cancelled.\')
else
begin
if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then
Writeln(\'Cannot go down. [\' + GetErrorstring + \']\')
else
Writeln(\'Shutting down!\');
end;
>
end;
// else begin
ExitWindowsEx(flgs, 0);
// end;
end;

begin
Writeln('Shutdown v0.3 for Win32 (similar to the Linux version)');
Writeln('(c) 2000 NeuralAbyss Software. All Rights Reserved.');
if HasParam('?') or (ParamCount = 0) then
begin
Writeln('Usage: shutdown [-akrhfnc] [-t secs]');
Writeln(' -k: don''t really shutdown, only warn.');
Writeln(' -r: reboot after shutdown.');
Writeln(' -h: halt after shutdown.');
Writeln(' -p: power off after shutdown');
Writeln(' -l: log off only');
Writeln(' -n: kill apps that don''t want to die.');
Writeln(' -c: cancel a running shutdown.');
end
else
begin
if HasParam('k') then warn := True;
if HasParam('r') then reboot := True;
if HasParam('h') and reboot then
begin
Writeln('Error: Cannot specify -r and -h parameters together!');
Exit;
end;
if HasParam('h') then reboot := False;
if HasParam('n') then downQuick := True;
if HasParam('c') then cancelShutdown := True;
if HasParam('p') then powerOff := True;
if HasParam('l') then logoff := True;
DoShutdown;
end;
end.


Для этого нам потребуются определённые привелегии:

function SetPrivilege(aPrivilegeName: string;
aEnabled: boolean): boolean;
var
TPPrev,
TP: TTokenPrivileges;
Token: THandle;
dwRetLen: DWord;
begin
Result := False;
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES
or TOKEN_QUERY, @Token);

TP.PrivilegeCount := 1;
if (LookupPrivilegeValue(nil, PChar(aPrivilegeName),
TP.Privileges[0].LUID)) then
begin
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;
CloseHandle(Token);
end;

function WinExit(iFlags: integer): boolean;
// возможные флаги:
// EWX_LOGOFF
// EWX_REBOOT
// EWX_SHUTDOWN
begin
Result := True;
if (SetPrivilege('SeShutdownPrivilege', true)) then
begin
if (not ExitWindowsEx(iFlags, 0)) then
begin
Result := False;
end;
SetPrivilege('SeShutdownPrivilege', False)
end
else
begin
Result := False;
end;
end;

Матвеев Мефодий Олегович: запишитесь-ка вы в эксперты. И материал официально будет опубликован, и вам рейтинг, и код в приложении лучше смотрится.

Читайте также: