RegisterPowerSettingNotification在Delphi中的使用

RegisterPowerSettingNotification在Delphi中的使用,delphi,winapi,delphi-xe2,Delphi,Winapi,Delphi Xe2,如何在Delphi XE2中与一起使用?如果不再需要调用,则必须使用所需的GUID调用以注册应用程序以接收特定电源设置事件的电源设置通知 delphi示例可能如下所示: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; const GUID_MONITOR_POWER_ON: TGUID

如何在Delphi XE2中与一起使用?

如果不再需要调用,则必须使用所需的GUID调用以注册应用程序以接收特定电源设置事件的电源设置通知

delphi示例可能如下所示:

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.
如果不再需要调用,则必须使用所需的GUID调用以注册应用程序以接收特定电源设置事件的电源设置通知

delphi示例可能如下所示:

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.

例如:但是你的实际问题是什么@Arioch,如果你想得到通知,你不需要有问题。Raw N,你可以再举一个例子。因为您使用的是Delphi XE2,所以不需要原型定义。我手头刚刚有德尔福2009。而且,我无法测试它,因为我不知道如何关闭笔记本电脑上的显示器:-)@TLama通常您不会从操作系统查询某些状态,并竭尽全力实现回调样板文件,只是为了丢弃结果。这通常是为了做一些决定。阅读上面的链接,立即询问目标。看起来liek通常这个回调是(ab)用来“让孩子吃了毒药后呕吐”,而不是“阻止他吃毒药”///笔记本:通常是使用手册中列出的Fn+某个组合键来完成的。但你确定窗户一定会被告知灯电源切断吗?如果我想测试它,我已经启动了stock Windows display off Screensaver,例如:但是您的实际问题是什么@Arioch,如果你想得到通知,你不需要有问题。Raw N,你可以再举一个例子。因为您使用的是Delphi XE2,所以不需要原型定义。我手头刚刚有德尔福2009。而且,我无法测试它,因为我不知道如何关闭笔记本电脑上的显示器:-)@TLama通常您不会从操作系统查询某些状态,并竭尽全力实现回调样板文件,只是为了丢弃结果。这通常是为了做一些决定。阅读上面的链接,立即询问目标。看起来liek通常这个回调是(ab)用来“让孩子吃了毒药后呕吐”,而不是“阻止他吃毒药”///笔记本:通常是使用手册中列出的Fn+某个组合键来完成的。但你确定窗户一定会被告知灯电源切断吗?如果我想测试它,我已经启动了股票窗口显示关闭screensaver@TLama我看到了你的例子。Bummi答案中的代码似乎运行良好。也许他的答案需要更新PBT_POWERSETTINGCHANGE?是的。您需要检查是哪个事件导致发送了
WM\u POWERBROADCAST
消息,然后如果是
PBT\u POWERSETTINGCHANGE
还需要检查是哪个电源通知导致了该事件(如果您注册的电源超过了
GUID\u MONITOR\u power\u ON
通知,这一点很重要)。但是如果这段代码对你来说足够了,那么我祝你好运!;-)只需附带说明,
HPOWERNOTIFY
在WinUser.h头文件中定义为
PVOID
。非常有用的答案,您不仅解决了我的问题。您还了解了如何获取标准delphi winapi中没有的windows信息。谢谢@特拉玛,我看到了你的例子。Bummi答案中的代码似乎运行良好。也许他的答案需要更新PBT_POWERSETTINGCHANGE?是的。您需要检查是哪个事件导致发送了
WM\u POWERBROADCAST
消息,然后如果是
PBT\u POWERSETTINGCHANGE
还需要检查是哪个电源通知导致了该事件(如果您注册的电源超过了
GUID\u MONITOR\u power\u ON
通知,这一点很重要)。但是如果这段代码对你来说足够了,那么我祝你好运!;-)只需附带说明,
HPOWERNOTIFY
在WinUser.h头文件中定义为
PVOID
。非常有用的答案,您不仅解决了我的问题。您还了解了如何获取标准delphi winapi中没有的windows信息。谢谢