Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Выключение или перезагрузка компьютера  (Прочитано 9541 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Snipper
Гость
« : 01-12-2004 18:46 » new

Можно ли присвоить кнопке функцию перезагрузки компьютера. Если можно,то как??? :?:  :!:  :!:  :?:
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #1 : 01-12-2004 19:25 » 

ExitWindows, ExitWindowsEx. но в NT придётся предварительно получить соответствующие привелегии и скормить их текущему процессу.
Записан

Серж
Гость
« Ответ #2 : 02-12-2004 08:41 » 

Dr.Snipper,  извини, но текст на С, переделка несложна.

BOOL SetCurrentPrivilege( LPCTSTR Privilege, BOOL bEnablePrivilege )
{
   HANDLE hToken;
   LUID luid;
   TOKEN_PRIVILEGES tp, tpPrevious;
   DWORD cbPrevious = sizeof( TOKEN_PRIVILEGES );
   BOOL bSuccess = FALSE;

   if ( ! LookupPrivilegeValue( NULL, Privilege, &luid ) )
      return FALSE;

   if( ! OpenProcessToken( GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken ) )
      return FALSE;

   tp.PrivilegeCount = 1;
   tp.Privileges[0].Luid = luid;
   tp.Privileges[0].Attributes = 0;

   AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof( TOKEN_PRIVILEGES ), &tpPrevious, &cbPrevious );

   if ( GetLastError() == ERROR_SUCCESS )
   {
      tpPrevious.PrivilegeCount = 1;
      tpPrevious.Privileges[0].Luid = luid;

      if ( bEnablePrivilege )
         tpPrevious.Privileges[0].Attributes |= ( SE_PRIVILEGE_ENABLED );
      else
         tpPrevious.Privileges[0].Attributes &= ~( SE_PRIVILEGE_ENABLED );

      AdjustTokenPrivileges( hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL );

      if ( GetLastError() == ERROR_SUCCESS )
         bSuccess=TRUE;
   }

   CloseHandle( hToken );

   return bSuccess;
}

if (!SetCurrentPrivilege( SE_SHUTDOWN_NAME, TRUE ) )
    {
          ::MessageBox(0,"Недостаточно привилегий!","",MB_OK);
         
    }

ExitWindowsEx(EWX_POWEROFF,0);
Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #3 : 02-12-2004 10:34 » 

ну да.

Код:
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;

// Example to shutdown Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_POWEROFF or EWX_FORCE);
end;

// Example to reboot Windows:

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyExitWindows(EWX_REBOOT or EWX_FORCE);
end;

хотя в 9x/Me достаточно просто сказать ExitWindows (...);

(код взят с vingrad.ru)
« Последнее редактирование: 02-12-2007 19:07 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines