我刚接触delphi不久,最近在编程过程中需要截获笔记本电脑合上屏幕时系统发送的消息,并做出处理。请问哪位朋友知道这个消息是什么?如何捕获最方便?有源码最好,兄弟想学习一下:)先谢……

解决方案 »

  1.   

    1、捕获wm_powerbroadcast消息,判断wParam的值,如下
      PBT_APMRESUMESUSPEND 唤醒时
      PBT_APMSUSPEND 待机时   
    Delphi(Pascal) code
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs;
    const
      PBT_APMQUERYSUSPEND = 0;
      PBT_APMRESUMECRITICAL = 6;
      PBT_APMRESUMESUSPEND = 7;
    type
      TForm1 = class(TForm)
      private
        { Private declarations }
        procedure WMPowerBC(var msg: TMessage); message WM_PowerBroadCast;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMPowerBC(var msg: TMessage);
    begin
      case msg.Wparam of
        PBT_APMQUERYSUSPEND     : msg.Result:=0;//待机
        PBT_APMRESUMECRITICAL ,
        PBT_APMRESUMESUSPEND : showmessage('resume');//唤醒
      end;
    end;http://topic.csdn.net/u/20090211/17/c214ac00-6f55-4491-b7a6-6dae376f4da4.html
      

  2.   

    合上屏幕之后的动作一般是可以设置的,比如待机、休眠、或者关闭显示器,也可以什么也不做
    这个不是Windows消息,是通过程序控制的,可以通过控制面板电源选项或单独程序(如ThinkPad的电源管理器)进行设置
      

  3.   

    3楼的说的是!
    wm_powerbroadcast 只是一个捕获电源事件的消息!
      

  4.   

    请问有哪些动作或情况下系统会发出这个wm_powerbroadcast消息?如何通过其参数wparam判断当前动作是合上笔记本,而不是其他动作?
      

  5.   

    发生电源事件的时候,
    http://msdn.microsoft.com/zh-cn/magazine/cc163386.aspx
      

  6.   

    我是准备自己写一个当笔记本合上后自动锁定计算机的小程序,因为我发现电源选项中并没有这个选择,我离开的时候习惯把笔记本合上,如果能减少一个按win+l的动作我想会更方便一点:)
      

  7.   

    截获WM_POWERBROADCAST消息通过wParam参数并不能确切地判断电源事件是否源于“开/合”本本,也可能是其它操作所致,不知从lParam参数中能否得到更多的信息(猜测一下)。
      

  8.   

    在笔记本上粘两个硬块,分别对准win和l键,每当合上笔记本时就...嘿嘿
      

  9.   

    查了MSDN,系统级的电源事件消息只有两个:WM_POWERBROADCAST,WM_POWER(已废弃),估计本本的开盖合盖事件要通过设备驱动去检测吧。
      

  10.   

    WM_POWERBROADCAST里好像不响应,本本合上的时候,屏幕是不是会关掉?是否可以从这里下手?jpexe,很喜欢你写的那个任务管理器!呵呵!
      

  11.   

    在笔记本上粘两个硬块,分别对准win和l键,每当合上笔记本时就...嘿嘿
    顶有创意。
      

  12.   

    感谢oloveuxyz大哥的回复,确实给了我一些灵感……但是我确实想把系统响应这一动作的原理搞懂,不然很容易导致编写的程序误操作~请问您是否知道这一原理或者知道相关资料给小弟推荐学习一下?不胜感激……
      

  13.   

    终于阻止了系统待机了
    function SetThreadExecutionState(esFlags: DWORD
      ): DWORD; stdcall; external 'kernel32.dll';
    const
      ES_SYSTEM_REQUIRED = $00000001;
      ES_DISPLAY_REQUIRED = $00000002;
      ES_CONTINUOUS = $80000000;procedure TForm12.Timer1Timer(Sender: TObject);
    begin
      SetThreadExecutionState(ES_SYSTEM_REQUIRED);
      SetThreadExecutionState(ES_DISPLAY_REQUIRED);
    end;经测试,在电源设置为合上本本待机的状态下,合上本本并不会待机!
    至于LZ想要的 锁定计算机 可以自己实现,比较简单!
      

  14.   

    过了几天终于又看到有新的东西出来,不过21楼的方法还是不行的,这样只是盲目地阻止系统“休息”,而LZ要的是能“准确响应”或者“检测”是否关闭盖子(Lid Off),这个并不符合LZ的需求。
      

  15.   


    恩 是的,这样不能坚持到否关闭盖子(Lid Off),我这样做的,是想在设置为合上的时候待机的情况下,阻止待机。 哈哈,很期待得到检测是否关闭盖子的方法!