Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Разное > Исходники и статьи
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 28.10.2010, 12:26
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,560
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию ExitWin - завершение работы Windows

Пример выключения компьютера на WinAPI.

Код:
program ExitWin;

uses
 Windows, Messages, CommCtrl;

const
 AppName='ExitWin v2.01 - Shut Down';

{$R ewres.Res}

var
 sec:byte;
 hwndPB:HWnd;

function About(Dialog: HWnd; Message : Cardinal; WParam : integer; LParam : integer): Bool; export; stdcall;
var
 DlgRect,rcClient:TRect;
begin
 about:=True;
 case Message of
  wm_InitDialog:
   begin
    InitCommonControls;
    GetClientRect(Dialog, rcClient);
    hwndPB:=CreateWindowEx(0, PROGRESS_CLASS, #0,
    WS_CHILD or WS_VISIBLE, rcClient.left + 10,
    rcClient.top + 40,
    rcClient.right - 20, 20,
    Dialog, 0, HInstance, nil);
    SendMessage(hwndPB, PBM_SETRANGE, 0, MAKELPARAM(0, 10));
    SendMessage(hwndPB, PBM_SETSTEP, 1, 0);
    SetDlgItemText(Dialog, 2, 'Отмена');  ///////////////////////
    SetDlgItemText(Dialog, 500, 'Через 10 секунд Windows завершит работу!');
    GetWindowRect(Dialog, DlgRect);
    SetWindowPos(Dialog, HWND_TOP,
    (GetSystemMetrics(SM_CXSCREEN) - DlgRect.Right + DlgRect.Left) div 2,
    (GetSystemMetrics(SM_CYSCREEN) - DlgRect.Bottom + DlgRect.Top) div 2,
    DlgRect.Right - DlgRect.Left,DlgRect.Bottom - DlgRect.Top,SWP_SHOWWINDOW);
    Exit;
   end;
 wm_Command: if LoWord(WParam) = id_Cancel
  then
   begin
    EndDialog(Dialog, LoWord(WParam));
    PostQuitMessage(0);
    Exit;
   end;
 end;
 about:=False;
end;

function WindowProc(Wnd: HWnd; Message, WParam: Word; LParam: Longint): Longint; export; stdcall;
begin
 WindowProc:=0;
 case Message of
  wm_Destroy:
   begin
    PostQuitMessage(0);
    Exit;
   end;
  wm_timer:
   begin
    if Sec < 10 then
     begin
      inc(sec);
      SendMessage(hwndPB, PBM_STEPIT, 0, 0);
      if Sec >= 10 then
       begin
        KillTimer(Wnd, 100);
        if ParamCount = 1 then
        if (ParamStr(1) = '/R') or (ParamStr(1) = '/r')
        then ExitWindowsEx(EWX_REBOOT, 0)
        else
         ExitWindowsEx(EWX_SHUTDOWN, 0)
        else
         ExitWindowsEx(EWX_SHUTDOWN, 0);
       end;
     end;
    exit;
   end;
  end;
 WindowProc:=DefWindowProc(Wnd, Message, WParam, LParam);
end;

procedure WinMainApi; export; stdcall;
const
 WindowClass:TWndClass=(style : 0;lpfnWndProc : @WindowProc;
                       cbClsExtra : 0; cbWndExtra : 0;
                       hInstance : 0; hIcon : 0;
                       hCursor : 0; hbrBackground : 0;
                       lpszMenuName : #0;lpszClassName : AppName);
var
 Message: TMsg;
 Window: HWnd;
begin
 WindowClass.hInstance := HInstance;
 if Windows.RegisterClass(WindowClass) = 0
 then Halt(255);
 Window := CreateWindow(AppName,AppName,0,0,0,0,0,0,0,HInstance,nil);
 ShowWindow(Window, SW_HIDE);
 Sec := 0;
 SetTimer(Window, 100, 1000, nil);
 DialogBox(HInstance, 'ABOUTBOX', Window, @About);
 while GetMessage(Message, 0, 0, 0) do
  begin
   TranslateMessage(Message);
   DispatchMessage(Message);
  end;
 KillTimer(Window, 100);
 UnRegisterClass(AppName, HInstance);
end;

begin
 WinMainApi;
end.

Автор неизвестен...
Ответить с цитированием
  #2  
Старый 28.10.2010, 12:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

xp, vista, 7 ExitWindowsEx(EWX_SHUTDOWN, 0) не выключит!
WindowsShutdown:
Код:
function EnableShutdownPrivledges: Boolean;
var
  hCurrentProcess: THandle;
  hTokenHandle: THandle;
  tp: _TOKEN_PRIVILEGES;
  PreviousState: _TOKEN_PRIVILEGES;
  ReturnLength: Cardinal;
begin
  hCurrentProcess:=GetCurrentProcess;
  if OpenProcessToken(hCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hTokenHandle) then
  begin
    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid) then
    begin
      tp.PrivilegeCount:=1;
      tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
      if AdjustTokenPrivileges(hTokenHandle, False, tp, SizeOf(_TOKEN_PRIVILEGES), PreviousState, ReturnLength) then Result:=True else Result:=False;
    end else Result:=False;
  end else Result:=False;
end;

function IsNT: Boolean;
var
  osv: _OSVERSIONINFOA;
begin
  ZeroMemory(@osv, SizeOf(_OSVERSIONINFOA));
  osv.dwOSVersionInfoSize:=SizeOf(_OSVERSIONINFOA);
  if GetVersionEx(osv) then
  begin
    if (osv.dwPlatformId=VER_PLATFORM_WIN32_NT) and (osv.dwMajorVersion>4) then Result:=True else Result:=False;
  end else Result:=False;
end;

function WindowsShutdown: Boolean;
begin
  if IsNT then
  begin
    if EnableShutdownPrivledges then Result:=ExitWindowsEx(EWX_SHUTDOWN, 0) else Result:=False;
  end else Result:=ExitWindowsEx(EWX_SHUTDOWN, 0)
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter