Форум: "Начинающим";
Текущий архив: 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 все это работает плохо. Надо думать…
Автор ответа: 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
Вот их хелпа выдрал — что там хз…
← →
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
Иногда может возникнуть необходимость в выключении на время устройств ввода — клавиатуры и мыши. Например, это неплохо сделать на время выполнения кода системы защиты от копирования, в играх, или в качестве «наказания» при запуске программы по истечению срока ее бесплатного использования … . Однако наилучшее ее применение — отключение клавиатуры и мыши на время работы демонстрационки, основанной на воспроизведении записанных заранее перемещений мышки и клавиатурного ввода (см. об этом отдельный раздел этой книги). Это элементарно сделать при помощи 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