Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Управление питанием.   Найти похожие ветки 

 
Galiaf   (2005-08-08 21:07) [0]

Вот я нашёл в литературе код для создания компонента управления питания, компонен это конечно лишнее мне надо только процедурка, вот я немного посидел и получилось что-то вроде того

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, MMSystem{, WinTypes, WinProcs/};
type
 TAction =(actLogOFF,actShutDown,actReBoot,actForce,actPowerOFF,actForceIfHung,actMonitorOFF,actMonitorON,actCDEject,actCDUnEject );

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);

 private
   { Private declarations }
   procedure PowerControll(value: taction);
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.PowerControll(value: taction);
begin
 with (Owner as TForm) do
   case value of
     actLogOff: ExitWindowsEx(EWX_LOGOFF,1);//вроде работает
     actShutDown: ExitWindowsEx(EWX_SHUTDOWN,1);//не работает
     actReBoot: ExitWindowsEx(EWX_REBOOT,1);//не работает
     actForce: ExitWindowsEx(EWX_FORCE,1);//вроде работает
     actPowerOff: ExitWindowsEx(EWX_POWEROFF,1);//не работает
     actForceIfHung: ExitWindowsEx(EWX_FORCEIFHUNG,1);//вроде работает
     actMonitorOFF: SendMessage(Application.MainForm.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 0);//не работает
     actMonitorON: SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);//не работает
     actCDEject: mciSendstring("SET CDAUDIO DOOR OPEN WAIT",nil,0, Handle);//вроде работает
     actCDUnEject: mciSendstring("SET CDAUDIO DOOR CLOSED WAIT",nil,0, Handle);//вроде работает
   end; {Case}
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 powercontroll(actMonitorOFF)
end;

end.


Из всего этого мне надо: перезагрузка, ждущий режим, выключение компьютера, выключение/включение монитора, а они как на зло не работают, может у меня что не так? Помогите с ошибкой.


 
Eraser ©   (2005-08-08 21:24) [1]

Galiaf   (08.08.05 21:07)
может у меня что не так?


Просто нету соответствующих прав на отключение.
uses Windows;

procedure RebootSystem;
var

handle, ph: THandle;
pid, n: DWORD;
luid: TLargeInteger;
priv: TOKEN_PRIVILEGES;
dummy: PTokenPrivileges;
ver: TOSVERSIONINFO;
begin

ver.dwOSVersionInfoSize := Sizeof(ver);
GetVersionEx(ver);
if ver.dwPlatformId=VER_PLATFORM_WIN32_NT then begin
pid := GetCurrentProcessId;
if OpenProcessToken(ph, TOKEN_ADJUST_PRIVILEGES, handle) then
if LookupPrivilegeValue(nil, "SeShutdownPrivilege", luid) then begin
priv.PrivilegeCount := 1;
priv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
priv.Privileges[0].Luid := luid;
dummy := nil;
AdjustTokenPrivileges(handle, false, priv, 0, dummy^, n);
end;
end;
ExitWindowsEx(EWX_REBOOT, 0);
end;


 
kami ©   (2005-08-08 21:26) [2]

Ну на счет EWX_POWEROFF и иже с ними неоднократно говорили - нужна привилегия SE_SHUTDOWN_NAME.
А SC_MONITORPOWER
Sets the state of the display. This command supports devices that have power-saving features, such as a battery-powered personal computer.
The lParam parameter can have the following values:

1 - the display is going to low power
2 - the display is being shut off
(с) Первоисточник


 
Galiaf   (2005-08-08 21:29) [3]

Отвратительно, значит покороче никак?


 
kami ©   (2005-08-08 21:33) [4]


> покороче никак?

Хе.
Вынеси получение привилегии в отдельную процедуру - будет "покороче".


 
Eraser ©   (2005-08-08 21:34) [5]

kami ©   (08.08.05 21:26) [2]

Может быть... код просто тупо скопировал с FAQ.


 
kami ©   (2005-08-08 21:42) [6]

2 [5] Eraser ©
Дык... собственно, не понял : претензий к коду - никаких, в фолиантах Microsoft все буква в букву. Просто предложил, чтобы основная процедура была покороче, вынести это в отдельную процедуру, типа
 GetMePrivilege{ и быстро!};
 case...  :))


 
kami ©   (2005-08-08 21:45) [7]

[0] Galiaf

> ExitWindowsEx(EWX_FORCEIFHUNG,1);//вроде работает

К стати, не понял... это, вроде, просто добавочный флаг - как он работает самостоятельно?


 
Eraser ©   (2005-08-08 21:45) [8]

kami ©   (08.08.05 21:42) [6]

Да эт я протормозил )


 
Galiaf   (2005-08-08 21:57) [9]

Чёт я попробовал код Eraser-а? а он неработает :(. Я чувствую себя некчёмным.


 
kami ©   (2005-08-08 22:06) [10]

Теперь моя очередь (2 Eraser) :)) Copy-Paste из моей проги
function TTCPParser.GrantShutdownAccess: Boolean;
{(c) чей-то с форума, в принципе вроде, аналогично [1]}
var
 hToken: THandle;
 lpVersionInformation: TOSVersionInfo;
 tkp: TTokenPrivileges;
 RetLen: DWORD;
 PreviousState: TTokenPrivileges;
begin
    lpVersionInformation.dwOSVersionInfoSize:=SizeOf (lpVersionInformation);
    Result:=GetVersionEx (lpVersionInformation);
    if not Result then
       Exit;
    if (lpVersionInformation.dwPlatformId = VER_PLATFORM_WIN32_NT) then
       begin
            if not OpenProcessToken (GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or
               TOKEN_QUERY, hToken) then
               begin
                    Result:=False;
                    Exit;
               end;
            Result:=LookupPrivilegeValue (nil, "SeShutdownPrivilege",
                                          tkp.Privileges[0].Luid);
            if not Result then
               Exit;
            PreviousState:=tkp;
            tkp.PrivilegeCount:=1;
            tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;
            if not (AdjustTokenPrivileges (hToken, False, tkp, SizeOf (PreviousState),
               PreviousState, RetLen)) then
              begin
                 Result:=False;
                 Exit;
              end;
       end;
    Result:=True;
end;

procedure TTCPParser.DoShutdownPC;
var
  ForceAppClosed,RebootAfterShutdown:Bool;
begin
    ForceAppClosed:=DataHeader.Unknown2;
    case DataHeader.Command of
         RebootPC:RebootAfterShutDown:=True;
         ShutDownPC:RebootAfterShutDown:=false;
    else
        exit;
    end;
    if GrantShutdownAccess then
       InitiateSystemShutdown(nil,nil,0,ForceAppClosed,RebootAfterShutDown);
end;

И все-же интересно получить ответ на [7]


 
kami ©   (2005-08-08 22:10) [11]

мнэээ... Прошу прощения, код-то работает, но вот в основном-то он предназначен для "гашения" из сервиса, а так вместо InitiateSystemShutdown вполне хватит ExitWindowsEx.


 
Galiaf   (2005-08-08 22:18) [12]

Если Вы имеете в виду что делает  "ExitWindowsEx(EWX_FORCEIFHUNG,1);//вроде работает", в принципе все где написано "вроде работает" просто выходит из системы(на страницу приветствия), если Вы имели в иду нечто другое, то тут уже никак помоч немогу(потому что незнаю(неопытный я)).
Кстати с процедуркой DoShutdownPC проблемы нарисовались, что есть DataHeader, мой делфи говорит "кака", всмысле подчёркивает красной полоской такой.


 
Galiaf   (2005-08-08 22:19) [13]

Есть идеи как МНЕ помоч?


 
kami ©   (2005-08-08 22:23) [14]

Я же говорю, что это copy-paste из моей проги.
Названия ForceAppClosed и RebootAfterShutDown по-моему, говорят сами за себя. Тем более, что это булевские переменные - установи ForceAppClosed:=True если нужно прервать приложения, и RebootAfterShutDown:=True, если нужно перезагрузиться, а не выключить. А DataHeader - выкинуть на...



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

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
1-1123493220
гость2
2005-08-08 13:27
2005.08.28
проверка значения


1-1123670582
ANB
2005-08-10 14:43
2005.08.28
Как избавится от порчи большого текста в TRichEdit


5-1094051343
New_User
2004-09-01 19:09
2005.08.28
динамический массив в gride


1-1123669045
BFG9k
2005-08-10 14:17
2005.08.28
RichEdit с картинками


14-1123006579
Creep
2005-08-02 22:16
2005.08.28
Забыл пароль свой. Проверяю