управление питанием РС
, как это проделать
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.215] |
|
|
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
управление питанием РС
, как это проделать
|
|
|
|
|
доброе время суток.
подскажите как с помощью АРI реализовать такие функции управления питание ПК так что б они работали и работали ПРАВИЛЬНО во всех WIN32. функции такие: 1. выключить ПК 2. перезагрузить ПК 3. завершить сеанс пользователя 4. ждущий режим 5. спящий режим смотрел в DRKB и в ФАКах: те примеры работают только под ОКНА 98/МЕ и то не правильно. основное внимание надо дать ХР/2К/2003 спасибо за помощь. |
|
Сообщ.
#2
,
|
|
|
|
Исходники не дам.
Вот функции: АctionModule index 3 name 'ActionModule', // procedure ActionModule(mAction:PChar); AboutModule index 4 name 'AboutModule'; // function AboutModule:PChar; Вот команды (mAction:PChar) 'POWEROFF', - Выключить питание 'REBOOT', - Перезагрузить компьютер 'LOGOFF', - Завершить сеанс пользователя 'MONOFF', - Выключить монитор 'SLEEPA', - Ждущий режим 'SLEEPB' - Спящий режим Работает на всех виндозов Прикреплённый файл Power.dll (25.5 Кбайт, скачиваний: 255)
|
|
Сообщ.
#3
,
|
|
|
|
а на 98 не работает PowerOff! в чем проблемма? как это исправить? какой 98 (SE или нет) не знаю?
|
|
Сообщ.
#4
,
|
|
|
|
Цитата Skynet @ а на 98 не работает PowerOff! в чем проблемма? как это исправить? какой 98 (SE или нет) не знаю? 'POWEROFF', - Выключить питание 'REBOOT', - Перезагрузить компьютер 'LOGOFF', - Завершить сеанс пользователя 'MONOFF', - Выключить монитор Работают и в 9x и в Nt. А 'SLEEPA', - Ждущий режим 'SLEEPB' - Спящий режим Только в Nt, тк поддержка таких функций в 9x не встроены. |
|
|
|
|
|
Исправлено.
Полностью работает и в Nt и в 9x. Слегка модифицированный модуль. ![]() ![]() function GetAutor:PChar; stdcall; index 1 external 'Power.dll'; function GetVersion:PChar; stdcall; index 2 external 'Power.dll'; function GetInfo:PChar; stdcall; index 4 external 'Power.dll'; function GetDisplayName:PChar; stdcall; index 5 external 'Power.dll'; function ModAction(const Action:PChar):PChar; stdcall; index 8 external 'Power.dll'; Команда Action: 'POWEROFF' - Выключение питания 'REBOOT' - Перезагрузка 'LOGOOFF' - Завершение сеанса 'MONOFF' - Выключения монитора 'SLEEP1' - Ждущий режим 'SLEEP2' - Спящий режим 'MINALLWINDOW' - Свернуть все окна // Тестированный вариант. Может не работать 'FORCE' - Форсированное выполнение команд: 'POWEROFF' 'REBOOT' 'LOGOOFF' Суть: Модуль записывает в рееср значение. При вызове одной из этих 3х функций получает из реестра значение. То Если вызвали один раз - модуль записывает значение 1 Если 2 и более, то записывает значение 0 и тд (1..0..1..0) Значение (0/1): Тип Reg_Binary RootKey HKey_Current_User SubKey 'Software\n0wheremany\VolumeC\Plugins'; Key 'Power_ForseAction'; Модуль к программе VolumeC http://www.nowhere10.russian.ru/content/volumec.html Добавлено Да к стати Модуль в Result выдаёт ошибку вида 'SMessage'TEXT, где TEXT-текст ошибки. в случае нормального выполнения - '' Прикреплённый файл Power.dll (24 Кбайт, скачиваний: 254)
|
|
Сообщ.
#6
,
|
|
|
|
OFFTOP:
С указанной ссылки, download VolumeC ведет в никуда! Очень хотелось взглянуть на VolumeC. ![]() И опять-же на указанном сайте не нашел как связаться с автором программы/сайта. Поэтому пишу об этом сюда. |
|
Сообщ.
#7
,
|
|
|
|
Цитата Петрович @ С указанной ссылки, download VolumeC ведет в никуда! Очень хотелось взглянуть на VolumeC Пока программа находится в разработе. Гдето Чз неделю доделаю. russian.ru - реально глючный сервак. может съел этот файл. в скором времени сайт переедет. Если что пиши на nowhere10@russian.ru. |
|
Сообщ.
#8
,
|
|
|
|
Цитата n0wheremany @ Исходники не дам. Что за блажь? Нафига писать целую библиотеку? А если вот тут посмотреть: Перезагрузка/выключение Windows. Как? |
|
Сообщ.
#9
,
|
|
|
|
Rouse_ - это не блаж, бублиотека идёт как модуль к программе.
s-mike - host russian вообще закрыли по ходу а bip пока не выклал файлы. Ссылка под каждым моим сообщением. |
|
Сообщ.
#10
,
|
|
|
|
Блин, но какой смысл выделять код из 5 тире 15-ти строк в виде отдельной библиотеки? Типа это круто?
|
|
Сообщ.
#11
,
|
|
|
|
Цитата n0wheremany @ Ссылка под каждым моим сообщением А ты сам-то по своей ссылке на VolumeC ходить пробовал? |
|
Сообщ.
#12
,
|
|
|
|
Rouse_ - а зачем тогда палагины к программам? Пускай все программы будут тогда без них и если нужно чтото добавить надо будет прогу заново компилить, не нужно будет скачивать допустим палагин, а надо будет скачивать поностью прогу...
Петрович - пробовал, всё ок. Если не канает Вот держи : http://n0where10.bip.ru/Content/volumec.html |
|
Сообщ.
#13
,
|
|
|
|
Цитата Rouse_ @ Что за блажь? Нафига писать целую библиотеку? А если вот тут посмотреть: Перезагрузка/выключение Windows. Как? а вот почему Цитата Skynet @ 3. завершить сеанс пользователя 4. ждущий режим 5. спящий режим Цитата Rouse_ @ Блин, но какой смысл выделять код из 5 тире 15-ти строк в виде отдельной библиотеки? Типа это круто? если не круто опубликуй код |
|
Сообщ.
#14
,
|
|
|
|
Цитата Skynet @ если не круто опубликуй код А по ссылочке в FAQ уже лень сходить? Жми сюда: Перезагрузка/выключение Windows. Как? Добавлено Цитата n0wheremany @ Rouse_ - а зачем тогда палагины к программам? А это разве плагин? А где стандартизация интерфейся плагина? |
|
Сообщ.
#15
,
|
|
|
|
Цитата Rouse_ @ Цитата (Skynet @ Сегодня, 12:40) если не круто опубликуй код А по ссылочке в FAQ уже лень сходить? Жми сюда: Перезагрузка/выключение Windows. Как? эту ссылку я и раньше смотрел! но она работае !!!не всегда и не везде!!!. и там нет Цитата Skynet @ .4. ждущий режим 5. спящий режим а библой все работает отлично. если ты другово мнения напиши аналог этой библиотеки и выложи исходник, я буду очень благодерен, потому как в 2000 Винде возникают проблемы с нахождением библиотеки.!!! |
|
Сообщ.
#16
,
|
|
|
|
Лови:
![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function SetPrivilege(aPrivilegeName: String; aEnabled: Boolean): Boolean; var TPPrev,TP: TTokenPrivileges; Token: THandle; dwRetLen: DWord; begin Result:=False; OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token); TP.PrivilegeCount := 1; if LookupPrivilegeValue(nil, PChar(aPrivilegeName), TP.Privileges[0].LUID) then begin if aEnabled then TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED else TP.Privileges[0].Attributes := 0; dwRetLen := 0; Result:=AdjustTokenPrivileges(Token, False, TP, SizeOf(TPPrev), TPPrev, dwRetLen); end; CloseHandle(Token); end; procedure TForm1.FormCreate(Sender: TObject); begin SetPrivilege('SeShutdownPrivilege', True); end; // Выключить комп procedure TForm1.Button1Click(Sender: TObject); begin ExitWindowsEx(EWX_POWEROFF, 0); end; // Перезагрузить procedure TForm1.Button2Click(Sender: TObject); begin ExitWindowsEx(EWX_REBOOT, 0) end; // Завершить сеанс procedure TForm1.Button3Click(Sender: TObject); begin ExitWindows(EWX_LOGOFF, 0) end; // Ждущий режим procedure TForm1.Button4Click(Sender: TObject); begin SetSystemPowerState(True, False); end; // Спящий режим procedure TForm1.Button5Click(Sender: TObject); begin SetSystemPowerState(False, False); end; end. |
|
Сообщ.
#17
,
|
|
|
|
А у меня такой вопрос - как запретить системе впадать в sleep ?
Программно, в смысле ? |
|
Сообщ.
#18
,
|
|
|
|
Цитата n0wheremany @ Петрович - пробовал, всё ок Да, теперь почти хорошо. Почему почти? Да потому что ссылка на темы (http://n0where10.bip.ru/Download/themes.exe) висячая. |
|
Сообщ.
#19
,
|
|
|
|
Цитата WildBear @ А у меня такой вопрос - как запретить системе впадать в sleep ? Хм, могу ошибиться, но боюсь из User Mode это не возможно... |
|
Сообщ.
#20
,
|
|
|
|
Петрович - не висячая, а просто сервак на Unixe a я прогил на Windows >> В Unixe файлы с разным регистром - разные файлы в отличии от Windows. Всё равно уже исправил.
Rouse_ [Хм, могу ошибиться, но боюсь из User Mode это не возможно... ] А можно подменой в библиотеке? |
|
Сообщ.
#21
,
|
|
|
|
Rouse_ тот исходник что ты выложил работает не весь.
в 98 не работает "Выключение" программа виполняет ЛогОфф. как это исправить? если возможно исправь. а вообщето написано хорошо и просто. |
|
Сообщ.
#22
,
|
|
|
|
Skynet - возможно ты чтото напутал с флагами... Для выключения используется флаг EWX_POWEROFF
|
|
Сообщ.
#23
,
|
|
|
|
n0wheremany с флагами ничего не напутано!
просто работает не правильно. а почему, не въеду... как ты писал в своей библе??? |
|
Сообщ.
#24
,
|
|
|
|
сообщение №23 это мое.
просто я заигрался немного |
|
Сообщ.
#25
,
|
|
|
|
Используешь ExitWindowsEx или ExitWindows?
|
|
Сообщ.
#26
,
|
|
|
|
Rouse_
как ты выложил так и пользую. а есть разница??? если да то как правильно программно определить какая Винда установленна (NT/2000/XP или 95/98/ME)& |
|
Сообщ.
#27
,
|
|
|
|
![]() ![]() function IsWindowsNT:boolean; var osVerInfo : TOSVersionInfo; begin result := false; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then result := true; end; Я использовал EWX_SHUTDOWN. Да кстати Rouse_ читал когдпто EWX_POWEROFF типа выходит к экрану типа "выключите теперь комп", это так? Почемута у меня в любом слючае работает, а когда даёш кому нид другому вылетает такая хрень. |
|
Сообщ.
#28
,
|
|
|
|
Цитата n0wheremany @ Да кстати Rouse_ читал когдпто EWX_POWEROFF типа выходит к экрану типа "выключите теперь комп", это так? Нужно эксперементировать, точно не смогу сказать... Цитата Skynet @ как правильно программно определить какая Винда установленна ![]() ![]() unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Registry, StdCtrls; type _OSVERSIONINFOEX = record dwOSVersionInfoSize : DWORD; dwMajorVersion : DWORD; dwMinorVersion : DWORD; dwBuildNumber : DWORD; dwPlatformId : DWORD; szCSDVersion : array[0..127] of AnsiChar; wServicePackMajor : WORD; wServicePackMinor : WORD; wSuiteMask : WORD; wProductType : BYTE; wReserved : BYTE; end; TOSVERSIONINFOEX = _OSVERSIONINFOEX; TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; function GetVersionExA(var lpVersionInformation: TOSVersionInfoEX): BOOL; stdcall; external kernel32; const VER_NT_WORKSTATION :Integer = 1; VER_SUITE_ENTERPRISE :Integer = 2; VER_NT_SERVER :Integer = 3; VER_SUITE_DATACENTER :Integer = 128; VER_SUITE_PERSONAL :Integer = 512; var Form1: TForm1; implementation {$R *.dfm} function OSInfo:String; var NTBres, BRes: Boolean; OSVI: TOSVERSIONINFO; OSVI_NT: TOSVERSIONINFOEX; TmpStr: String; begin Result := 'Error'; NTBRes := False; try OSVI_NT.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFOEX); NTBRes := GetVersionExA(OSVI_NT); OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); BRes := GetVersionEx(OSVI); except OSVI.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); BRes := GetVersionEx(OSVI); end; if (not BRes) and (not NTBres) then Exit; Move(OSVI, OSVI_NT, SizeOf(TOSVersionInfo)); case OSVI_NT.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if OSVI_NT.dwMajorVersion <= 4 then Result := 'Windows NT '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 0) then Result := 'Windows 2000 '; if (OSVI_NT.dwMajorVersion = 5) and (OSVI_NT.dwMinorVersion = 1) then Result := 'Windows XP '; if NTBres then begin if OSVI_NT.wProductType = VER_NT_WORKSTATION then begin if OSVI_NT.wSuiteMask = VER_SUITE_PERSONAL then Result := Result + 'Personal' else Result := Result + 'Professional'; end else if OSVI_NT.wProductType = VER_NT_SERVER then begin if OSVI_NT.wSuiteMask = VER_SUITE_DATACENTER then Result := Result + 'DataCenter Server' else if OSVI_NT.wSuiteMask = VER_SUITE_ENTERPRISE then Result := Result + 'Advanced Server' else Result := Result + 'Server'; end; end else begin with TRegistry.Create do try RootKey := HKEY_LOCAL_MACHINE; if OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then try TmpStr := UpperCase(ReadString('ProductType')); if TmpStr = 'WINNT' then Result := Result + 'Workstation'; if TmpStr = 'SERVERNT' then Result := Result + 'Server'; finally CloseKey; end; finally Free; end; end; end; VER_PLATFORM_WIN32_WINDOWS : begin if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 0) then begin Result := 'Windows 95 '; if OSVI.szCSDVersion[1] = 'C' then Result := Result + 'OSR2'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 10) then begin Result := 'Windows 98 '; if OSVI.szCSDVersion[1] = 'A' then Result := Result + 'SE'; end; if (OSVI.dwMajorVersion = 4) and (OSVI.dwMinorVersion = 90) then Result := 'Windows Me'; end; VER_PLATFORM_WIN32s: Result := 'Microsoft Win32s'; else Result := 'Unknown'; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(OSInfo); end; end. |
|
Сообщ.
#29
,
|
|
|
|
Rouse_
спасибо тебе за исходник я его себе сохранил. еще раз убеждаюсь в великодушности программистов! но есть очень маленькое Но.... мне ненужен такой огромный код, мне бы всего навсего узнать Винда линейки НТ или нет, для того чтоб знать какой функцией пользоватся. |
|
Сообщ.
#30
,
|
|
|
|
n0wheremany, вот эту конструкцию
![]() ![]() if osVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT then result := true; Гораздо красивее и логичнее переписать как: ![]() ![]() Result := osVerInfo.dwPlatformId = VER_PLATFORM_WIN32_NT; Добавлено Цитата Skynet @ мне ненужен такой огромный код, мне бы всего навсего узнать Винда линейки НТ или нет, для того чтоб знать какой функцией пользоватся Есть такая переменная Win32Platform вот какие значения она может примерять: Цитата VER_PLATFORM_WIN32s System is Win32s. VER_PLATFORM_WIN32_WINDOWS System is Windows 95. VER_PLATFORM_WIN32_NT System is Windows NT. Поэтому тебе достаточно лишь проверять ее состояние не прибегая к написанию своих функций... |
|
Сообщ.
#31
,
|
|
|
|
2n0wheremany
Пробую выклчить монитор используя библиотеку power.dll... выходит ошиПка обращения к памяти... Может кто поможет ? |
|
Сообщ.
#32
,
|
|
|
|
n0wheremany, фигассе! Таскать библиотеку 25 кб чтобы выключить/перезагрузить комп... нет уж, спасибо
![]() Цитата Skynet @ мне бы всего навсего узнать Винда линейки НТ или нет Можно ещё так: ![]() ![]() IsWin9xOrMe := (GetVersion and $80000000) <> 0; |