Показать сообщение отдельно
  #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.

Автор неизвестен...
Ответить с цитированием