2013-07-28 3 views
0

Как использовать RegisterPowerSettingNotification в сочетании с GUID_MONITOR_POWER_ON в Delphi XE2?RegisterPowerSettingNotification использование в Delphi

+0

, например, как это: http://forum.sources.ru/index.php?showtopic=314202 Но какова ваша текущая проблема? http://www.catb.org/~esr/faqs/smart-questions.html#goal –

+1

@Arioch, вам не нужно иметь проблемы, если вы хотите получать уведомления от ['GUID_MONITOR_POWER_ON'] (http : //msdn.microsoft.com/en-us/library/windows/desktop/hh448380.aspx#GUID_MONITOR_POWER_ON). Raw N, еще один пример, вы можете ['find here'] (http://pastebin.com/Evs5D0pN). Поскольку вы используете Delphi XE2, вам не понадобятся определения прототипов. У меня есть только Delphi 2009 от руки. И я не могу его протестировать, так как не знаю, как отключить монитор на моем ноутбуке :-) – TLama

+0

@TLama Обычно вы не запрашиваете какое-либо состояние из ОС и не выполняете длину, чтобы реализовать шаблон обратного вызова, чтобы отменить результат. Обычно это делается для принятия какого-либо решения. И ссылка выше, прочитайте ее, немедленно спросите о цели. Похоже, что этот обратный вызов (ab) используется, чтобы «вызвать рвоту ребенка после того, как он съел яд». «ВМЕСТО» запретил ему есть яд »/// Блокнот: Обычно это делается с помощью комбинации Fn + some-key, перечисленных в руководствах. Но уверены ли вы, что Windows будет обязательно проинформирована об отключении питания лампы? Если бы я захотел протестировать его, я бы запустил стопку Windows display-off screensaver –

ответ

4

Вы должны вызвать RegisterPowerSettingNotification с нужным идентификатором GUID Power Setting GUIDs для регистрирует заявку на получение уведомлений настройки мощности для конкретного события установки мощности, если больше не нужен вызов UnregisterPowerSettingNotification.

Дельфи пример может выглядеть следующим образом:

unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls; 

const 
    GUID_MONITOR_POWER_ON: TGUID = '{02731015-4510-4526-99e6-e5a17ebd1aea}'; 

type 

    TForm1 = class(TForm) 
    Memo1: TMemo; 
    procedure FormCreate(Sender: TObject); 
    procedure FormDestroy(Sender: TObject); 
    private 
    FHPOWERNOTIFY: THandle; 
    protected 
    procedure WM_POWERBROADCAST(var Msg: TMessage); message WM_POWERBROADCAST; 
    end; 

function RegisterPowerSettingNotification(hRecipient: THandle; 
    PowerSettingGuid: PGUID; Flags: DWORD): THandle; stdcall; 
external 'user32.dll'; 
function UnregisterPowerSettingNotification(Handle: THandle): BOOL; stdcall; 
external 'user32.dll'; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    FHPOWERNOTIFY := RegisterPowerSettingNotification(Handle, 
    @GUID_MONITOR_POWER_ON, DEVICE_NOTIFY_WINDOW_HANDLE); 
end; 

procedure TForm1.FormDestroy(Sender: TObject); 
begin 
    UnregisterPowerSettingNotification(FHPOWERNOTIFY); 
end; 

procedure TForm1.WM_POWERBROADCAST(var Msg: TMessage); 
begin 
    if PPOWERBROADCAST_SETTING(Msg.LParam)^.Data[0] = 0 then 
    Memo1.Lines.Add('Off') 
    else 
    Memo1.Lines.Add('ON') 
end; 

end. 
+1

@TLama, вы правы, я пропустил чтение – Peter

+0

@TLama Я видел ваш пример. Код в ответе Bummi, кажется, работает очень хорошо. Может быть, его ответ должен быть обновлен для PBT_POWERSETTINGCHANGE? –

+1

Да. Вам нужно проверить, какое событие вызвало сообщение «WM_POWERBROADCAST», а затем, если оно было «PBT_POWERSETTINGCHANGE», также проверяет, какое уведомление о мощности вызвало это событие (это важно, если вы зарегистрировали больше, чем уведомление GUID_MONITOR_POWER_ON) , Но если этого достаточно для вас, то желаю вам удачи! ;-) Просто боковое значение, 'HPOWERNOTIFY' определяется как' PVOID' в файле заголовка WinUser.h. – TLama

Смежные вопросы