Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2007, 22:45   #1
ChukCha
Пользователь
 
Регистрация: 18.04.2007
Сообщений: 80
По умолчанию Выключте мой комп

Помогите мне плис. Мне нужно что бы при нажатии на кнопку мой комп выключалса полностю. Потомучто если исполюзую етот в XP то выключает до смены пользователя.
код который я использувал:

ExitWindows (EWX_ShutDown,0);
и
ExitWindows (EWX_FORCE,0);
ChukCha вне форума Ответить с цитированием
Старый 30.05.2007, 23:17   #2
Nemon
Армия Рассейская
Форумчанин
 
Аватар для Nemon
 
Регистрация: 06.12.2006
Сообщений: 175
По умолчанию

Код:
function MyExitWindows(RebootParam: Longword): Boolean;  
var  
  TTokenHd: THandle;  
  TTokenPvg: TTokenPrivileges;  
  cbtpPrevious: DWORD;  
  rTTokenPvg: TTokenPrivileges;  
  pcbtpPreviousRequired: DWORD;  
  tpResult: Boolean;  
const  
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';  
begin  
  if Win32Platform = VER_PLATFORM_WIN32_NT then  
  begin  
    tpResult := OpenProcessToken(GetCurrentProcess(),  
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,  
      TTokenHd);  
    if tpResult then  
    begin  
      tpResult := LookupPrivilegeValue(nil,  
                                       SE_SHUTDOWN_NAME,  
                                       TTokenPvg.Privileges[0].Luid);  
      TTokenPvg.PrivilegeCount := 1;  
      TTokenPvg.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;  
      cbtpPrevious := SizeOf(rTTokenPvg);  
      pcbtpPreviousRequired := 0;  
      if tpResult then  
        Windows.AdjustTokenPrivileges(TTokenHd,  
                                      False,  
                                      TTokenPvg,  
                                      cbtpPrevious, 
                                      rTTokenPvg, 
                                      pcbtpPreviousRequired); 
    end; 
  end; 
  Result := ExitWindowsEx(RebootParam, 0);
end; 

//Выключение
procedure TForm1.Button18Click(Sender: TObject);
begin
 MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;
Сделаем ночь ярче!!! - Ракетные войска стратегического назначения
Центральный клуб туристов РВСН
Nemon вне форума Ответить с цитированием
Старый 11.07.2007, 22:06   #3
BanDit
Пользователь
 
Аватар для BanDit
 
Регистрация: 26.05.2007
Сообщений: 58
По умолчанию

Вот еще способ. Полностью код:
Код:
program ExitWin;

uses Windows, Messages, CommCtrl;

const
  AppName = 'ExitWin v2.01 (c) a.lee 1998';

{$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.
от модера: следующий раз используй теги CODE

Последний раз редактировалось rpy3uH; 12.07.2007 в 20:16.
BanDit вне форума Ответить с цитированием
Старый 12.07.2007, 11:01   #4
Xandr
Пользователь
 
Регистрация: 12.07.2007
Сообщений: 60
По умолчанию

Код:
function GetWinVersion: String;  
var  
   VersionInfo : TOSVersionInfo;  
   OSName      : String;  
begin  
   // устанавливаем размер записи 
   VersionInfo.dwOSVersionInfoSize := SizeOf( TOSVersionInfo );  

   if Windows.GetVersionEx( VersionInfo ) then  
      begin  
         with VersionInfo do  
         begin  
            case dwPlatformId of  
               VER_PLATFORM_WIN32s   : OSName := 'Win32s';  
               VER_PLATFORM_WIN32_WINDOWS : OSName := 'Windows 95';  
               VER_PLATFORM_WIN32_NT      : OSName := 'Windows NT';  
            end; // case dwPlatformId  
            Result := OSName + ' Version ' + IntToStr( dwMajorVersion ) + '.' + IntToStr( dwMinorVersion ) +  
                      #13#10' (Build ' + IntToStr( dwBuildNumber ) + ': ' + szCSDVersion + ')';  
         end; // with VersionInfo  
      end // if GetVersionEx  
   else  
      Result := '';  
end;  

procedure ShutDown;  
const  
  SE_SHUTDOWN_NAME = 'SeShutdownPrivilege';   // Borland forgot this declaration  
var  
  hToken       : THandle;  
  tkp          : TTokenPrivileges;  
  tkpo         : TTokenPrivileges;  
  zero         : DWORD;  
begin  
  if Pos( 'Windows NT', GetWinVersion) = 1  then // we've got to do a whole buch of things  
     begin  
        zero := 0;  
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  
           begin  
             MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  
             Exit;  
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  
        if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then  
           begin  
             MessageBox( 0, 'Exit Error', 'OpenProcessToken() Failed', MB_OK );  
             Exit;  
           end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken)  


        // SE_SHUTDOWN_NAME  
        if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[ 0 ].Luid ) then  
           begin  
              MessageBox( 0, 'Exit Error', 'LookupPrivilegeValue() Failed', MB_OK );  
              Exit;  
           end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid )  
        tkp.PrivilegeCount := 1;  
        tkp.Privileges[ 0 ].Attributes := SE_PRIVILEGE_ENABLED;  

        AdjustTokenPrivileges( hToken, False, tkp, SizeOf( TTokenPrivileges ), tkpo, zero );  
        if Boolean( GetLastError() ) then  
           begin  
              MessageBox( 0, 'Exit Error', 'AdjustTokenPrivileges() Failed', MB_OK );  
              Exit;  
           end // if Boolean( GetLastError() )  
        else  
           ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );  
      end // if OSVersion = 'Windows NT'  
   else  
      begin // just shut the machine down  
        ExitWindowsEx( EWX_FORCE or EWX_SHUTDOWN, 0 );  
      end; // else  
end;
от модера: в следующий раз используй теги CODE

Последний раз редактировалось rpy3uH; 12.07.2007 в 20:29.
Xandr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
комп. для программирования фамил Компьютерное железо 4 09.05.2008 12:11
Комп здох Х_Х JTG Компьютерное железо 13 03.04.2008 10:05
Игровой комп Simply-Art Компьютерное железо 7 15.02.2008 09:29
Не включается комп Viteef Компьютерное железо 2 28.01.2008 06:29
Найти комп без Ip... prizrak1390 Работа с сетью в Delphi 5 24.01.2008 13:08