|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
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
|
||||
|
||||
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; Пишу программы за еду. __________________ |