Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Паскаль и Дельфи (http://www.tehnari.ru/f41/t55952/)

jax 15.08.2011 19:46

Паскаль и Дельфи
 
Здравствуйте,у меня вот что пришло в голову,возможно в дельфи или в паскале написать такую прграмму - "При нажатие кнопки выключается компьютер " Если вдруг ктонибуть знает как это сделать,жду ваших ответов

AlexZir 16.08.2011 08:34

Команда выключения компьютера shutdown -s . Думаю, прикрутить её к кнопке тоже не составит большого труда :))

Должен сказать, что для выполнения команды выключения нужно обладать определенными привелегиями в системе.

Вот примеры команд из Delpi World:
Цитата:

rundll32 shell32,SHExitWindowsEx 1
Выключение компьютера

rundll32 shell32,SHExitWindowsEx 0
Завершить работу текущего пользователя

rundll32 krnl386.exe,exitkernel
Выход из Windows без любых вопросов
Вот еще вариант команды выключения компьютера оттуда же :)
Цитата:

ExitWindowsEx(EWX_POWEROFF or ewx_force,0);
Пропишите ее в обработчике OnClick вашей кнопки :)

AlexZir 16.08.2011 08:55

Вот листинг, позволяющий выключить компьютер из ОС Windows:
Цитата:

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;
Vista и 7-ку автор не проверял, поэтому неизвестно, заработает ли под ними.

jax 16.08.2011 10:57

спасибо,щас попробую,я на XP проверю,я думал не кто не ответит))

jax 16.08.2011 11:22

чё то у меня не получается,я ставлю кнопку,копирую туда код,запускаю,ошибка. Вы сказали прописать в обработчике OnClick,но я не знаю как это сделать,как прописать в обработчике OnClick,скажите пожалуйста,я только начинаю обучатся в дельфи :tehnari_ru_203:

AlexZir 16.08.2011 13:53

Помещаете компоненту Button на форму, делаете двойной щелчок по появившейся кнопке и вставляете код.

З.Ы. В приведенном листинге описаны функции и процедуры без привязки к событиям, вряд ли вы на начальном уровне знаний сможете им воспользоваться. RTFM

jax 16.08.2011 15:39

Всё работает,спасибо большое


Часовой пояс GMT +4, время: 01:29.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.