Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Вниз

Програмное выключение компьютера   Найти похожие ветки 

 
Romm ©   (2007-04-16 18:35) [0]

Мастера, подскажите пожалуйста функцию выключения компьютера.
Спасиб.

Выключение при помощи нажатия кнопки на системном блоке или пуск/выключение не предлагать :))


 
Romm ©   (2007-04-16 18:57) [1]

И вот еще что :)
Не могли бы Вы подсказать, как заблокировать ввод данных с клавиатуры? Не то, что бы ввод, а что бы windows вообще не реагировала на  нажатие клавиш, до поры, до времени :)


 
Kolan ©   (2007-04-16 19:01) [2]

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;  

Взято с Исходников.ru http://www.sources.ru

--------------------------------------------------------------------------------

ExitWindowsEx(EWX_FORCE,0);

или

Запуск из коммандной строки

rundll32 krnl386.exe,exitkernel

только под XP все это работает плохо. Надо думать&#133
Автор ответа: Vit
Взято с Vingrad.ru http://forum.vingrad.ru

--------------------------------------------------------------------------------

exitkernel очень радикальный способ потому что не сохраняются настройки рабочего стола, ini файлы и другие установки, зато быстро

Есть способ намного лучше: ф-ия SHExitWindowsEx из shell32.dll
С неё всё good. Это запуск из-под WinExec()
Программно же только с получением привелегии.
Замечу также что флаг EWX_FORCE необходим только для принудительного завершения при выдаче каких либо сообщений или модальных окон, что воспрепятствует завершению, например, «К компьютеру подключены пользователи. Данные могут быть утярены. Вы хотите завершить работу?» или сообщение, которое автор указал в вопросе.
Если нет таких сообщений EWX_FORCE не обязателен. Также есть отдельные флаги для выключение компьютера (по умолчанию — перезагрузка) или завершения сетевого сеанса.

Автор ответа: Song
Взято с Vingrad.ru http://forum.vingrad.ru


Вот их хелпа выдрал — что там хз&#133


 
Romm ©   (2007-04-16 19:06) [3]

Спасиб огромное.
*погрузился в чтение*


 
Kolan ©   (2007-04-16 19:08) [4]

procedure LockPC;  
 var OldValue: LongBool;  
begin  
SystemParametersInfo(97, Word(Bool), @OldValue, 0);  

WinExec(PChar("rundll32 mouse,disable"), SW_SHOW);  

WinExec(PChar("rundll32 keyboard,disable"), SW_SHOW);  

 
end;


Оттуда же — качество тоже. Это про второй вопрос.

ЗЫ

> Не могли бы Вы подсказать, как заблокировать ввод данных
> с клавиатуры?


 Не делай так никогда.


 
Romm ©   (2007-04-16 19:14) [5]


>  Не делай так никогда.

вреда я никому не причиню, даже не хочется, да и пока врядле можется :)
Пишу прогу для администрирования удаленного компьютера, хотя она и напоминает троянчик по функциям. :)


 
Romm ©   (2007-04-16 19:16) [6]


> SystemParametersInfo(97, Word(Bool), @OldValue, 0);

а это что такое? и для чего?


 
Kolan ©   (2007-04-16 19:22) [7]

> а это что такое? и для чего?

Я ж грю выдрал из хелпа, незнаю.


 
Romm ©   (2007-04-16 19:29) [8]


> Kolan ©   (16.04.07 19:22) [7]

А вдруг.. :)


 
Kolan ©   (2007-04-16 19:32) [9]

Включение и выключение устройств ввода/вывода
Previous  Top  Next  

Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования &#133 . Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи API:
EnableHadwareInput(Enable:boolean): boolean;
Enable — требуемое состояние устройств ввода (True — включены, false — выключены). Если ввод заблокирован, то его можно разблокировать вручную — нажать Ctrl + Alt + Del, при появлении меню «Завершение работы программы» ввод разблокируется.

А вот еще интересный прикол.
Включение/выключение монитора программным способом.

Предупреждаю сразу! После того, как вы отключите монитор, просто так вы его уже не включите (хотя это может быть зависит от монитора, я, во всяком случае, не смог). Только после перезагрузки компьютера.

Отключить :
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);

Включить :
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, —1);


Вот еще :)


 
Romm ©   (2007-04-16 19:40) [10]

Ок, щас первый способ пробовать буду, если не пройдет - надеюсь это спасет :)


 
Romm ©   (2007-04-16 19:46) [11]


> SystemParametersInfo(97, Word(Bool), @OldValue, 0);

эх, мне эта строчка сразу не понравилась :) в ней ошибка где-то...


 
Romm ©   (2007-04-16 20:00) [12]

так, и вторрой способ что-то не получается, видно руки уж больно кривые... Обьясните как пользоваться данной winApi функцией
EnableHadwareInput(Enable:boolean): boolean;

я делал так:
 Enable_:=true;
 Enable_:=EnableHadwareInput(Enable_);


 
Kolan ©   (2007-04-16 20:06) [13]

> я делал так:
> Enable_:=true;
> Enable_:=EnableHadwareInput(Enable_);

А так нельзя?

EnableHadwareInput(False);
?


 
Romm ©   (2007-04-17 06:25) [14]

[Error] MainUnit.pas(105): Undeclared identifier: "EnableHadwareInput"

может нужно модуль какой-нибудь подключить?


 
Робинзон   (2007-04-19 11:37) [15]

Попробуй подключить ShellApi


 
Romm ©   (2007-04-19 12:04) [16]

не подходит!
Но я уже знаю как выключить!
Всем спасибо!



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.043 c
15-1176651455
nnn1
2007-04-15 19:37
2007.05.13
GetLowerBound / GetUpperBound из .NET


2-1177431055
Oleg_teacher
2007-04-24 20:10
2007.05.13
Обьединит файлы


6-1163136356
Новичок777
2006-11-10 08:25
2007.05.13
Автологин


15-1176460161
Kamuto Hirovato
2007-04-13 14:29
2007.05.13
Все тайное становится явным.


3-1172059555
newby
2007-02-21 15:05
2007.05.13
firebird embedded





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский