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

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

Перезагрузка с принудительным закрытием всех приложений


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);


Наверх

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