![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перезагрузка с принудительным закрытием всех приложений
MAXHO © (2005-12-08 09:33:00)Здравствуйте.
Есть приложение написаное а Делфи и в нем запрещено закрытие формы (CanClose := False). При попытки перезагрузки компа прога не закрываеться и комп остается включеным. Подскажите код программы для принудительной перезагрузки и выключения компа (только чтоб небыло надписи "Теперь питание компьютера можно отключить" в WindowsXP)
kami (2005-12-08 11:48:00) [1]MAXHO © (08.12.05 10:46) [12]
попробуй поставить ExitWindowsEx(EWX_POWEROFF or EWX_FORCE,0)
MAXHO (2005-12-08 10:46:00) [2]Alt+F4 например
HF-Trade (2005-12-08 10:44:00) [3]Если кнопок нету как его закрыть тоды? ;)
MAXHO (2005-12-08 10:43:00) [4]Это шелл для клуба, там вообще никаких кнопок нету :)
HF-Trade (2005-12-08 10:41:00) [5]Убери кнопку - закрыть:)
Что это за приложение то такое?:)
MAXHO (2005-12-08 10:39:00) [6]Ниодин метод не помогает форма не закрывается.
Блин похоже придеться переписывать код и убирать CanClose. Тогда такой вопрос, как еще можно запретить закрытие формы юзером?
MAXHO (2005-12-08 10:33:00) [7]kami
Не убиваеться процесс :(
MAXHO (2005-12-08 10:27:00) [8]stone
Не закрывает форму...
HF-Trade (2005-12-08 10:27:00) [9]procedure PowerOff(Flags: UINT);
var
tokenPriv: TTokenPrivileges;
tokenHandle: THandle;
begin
if (Win32Platform = VER_PLATFORM_WIN32_NT) and
((Flags and (EWX_POWEROFF or EWX_REBOOT or EWX_SHUTDOWN)) <> 0) then
begin
if OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,
TokenHandle) then begin
if LookupPrivilegeValue(nil,'SeShutdownPrivilege',
TokenPriv.Privileges[0].LUID) then
begin
TokenPriv.PrivilegeCount:=1;
TokenPriv.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not AdjustTokenPrivileges(TokenHandle,false,TokenPriv,0,
TTokenPrivileges(nil^),DWORD(nil^)) then exit;
end;
end;
end;
ExitWindowsEx(Flags, 0);
end;
......
//Флаги -
EWX_POWEROFF
EWX_REBOOT
EWX_ShutDown
//Выключение
PowerOff(EWX_ShutDown);
kami (2005-12-08 10:19:00) [10]
function TForm1.GrantShutdownAccess: Boolean;
var
hToken: THandle;
lpVersionInformation: TOSVersionInfo;
tkp: TTokenPrivileges;
RetLen: DWORD;
PreviousState: TTokenPrivileges;
begin
lpVersionInformation.dwOSVersionInfoSize:=SizeOf (lpVersionInformation);
Result:=GetVersionEx (lpVersionInformation);
if not Result then
Exit;
if (lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_NT) then
begin
if not OpenProcessToken (GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
TOKEN_QUERY, hToken) then
begin
Result:=False;
Exit;
end;
Result:=LookupPrivilegeValue (nil, 'SeShutdownPrivilege',
tkp.Privileges[0].Luid);
if not Result then
Exit;
PreviousState:=tkp;
tkp.PrivilegeCount:=1;
tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
if not (AdjustTokenPrivileges (hToken, False, tkp, SizeOf (PreviousState),
PreviousState, RetLen)) then
begin
Result:=False;
Exit;
end;
end;
Result:=True;
end;
procedure TForm1.Button1Click(Sender:TObject);
begin
if GrantShutdownAccess then
ExitWindowsEx(EWX_POWEROFF or EWX_FORCEIFHUNG,0);
// EWX_LOGOFF - завершение текущего сеанса
// EWX_POWEROFF - выключение питания
// EWX_REBOOT - перезагрузка
// EWX_SHUTDOWN - выключение компа
// дополнительные флаги
// EWX_FORCEIFHUNG - быстрое завершение "зависших" процессов
// EWX_FORCE - быстрое завершение всех процессов
end;
ЗЫ. Нехорошо это, так завершать всё, приложения могут просто не сохранить свои данные, и потом будет "больно и обидно за бесцельно прожитые годы" ((с) чье-то). Может, стоит пересмотреть это приложение, да и убрать нафиг CanClose:=False?
MAXHO (2005-12-08 10:14:00) [11]tesseract
[Error] Unit1.pas(28): Undeclared identifier: 'SHTDN_REASON_MAJOR_HARDWARE'
stone (2005-12-08 10:00:00) [12]
> Подскажите код программы для принудительной перезагрузки
> и выключения компа
http://web.avtosklad.info/psites/ovainsh/Downloads/Programms/Miscellaneous/AutoShut_source.zip
здесь выключение
> только чтоб небыло надписи "Теперь питание компьютера можно
> отключить" в WindowsXP
Это аппаратная проблема, в частности отсутствeт или выключено ACPI.
tesseract (2005-12-08 09:58:00) [13]
> Есть приложение написаное а Делфи и в нем запрещено закрытие
> формы (CanClose := False).
А приложение не может перехватывать WM_ENDSESSION WM_QUERYENDSESSION?
Тогда убиваемся :
ExitWindowsEx(ewx_reboot or ewx_force, SHTDN_REASON_MAJOR_HARDWARE);