关于截获系统消息的问题 我刚接触delphi不久,最近在编程过程中需要截获笔记本电脑合上屏幕时系统发送的消息,并做出处理。请问哪位朋友知道这个消息是什么?如何捕获最方便?有源码最好,兄弟想学习一下:)先谢…… 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、捕获wm_powerbroadcast消息,判断wParam的值,如下 PBT_APMRESUMESUSPEND 唤醒时 PBT_APMSUSPEND 待机时 Delphi(Pascal) codeunit 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 合上屏幕之后的动作一般是可以设置的,比如待机、休眠、或者关闭显示器,也可以什么也不做这个不是Windows消息,是通过程序控制的,可以通过控制面板电源选项或单独程序(如ThinkPad的电源管理器)进行设置 3楼的说的是!wm_powerbroadcast 只是一个捕获电源事件的消息! 请问有哪些动作或情况下系统会发出这个wm_powerbroadcast消息?如何通过其参数wparam判断当前动作是合上笔记本,而不是其他动作? 发生电源事件的时候,http://msdn.microsoft.com/zh-cn/magazine/cc163386.aspx 我是准备自己写一个当笔记本合上后自动锁定计算机的小程序,因为我发现电源选项中并没有这个选择,我离开的时候习惯把笔记本合上,如果能减少一个按win+l的动作我想会更方便一点:) 截获WM_POWERBROADCAST消息通过wParam参数并不能确切地判断电源事件是否源于“开/合”本本,也可能是其它操作所致,不知从lParam参数中能否得到更多的信息(猜测一下)。 在笔记本上粘两个硬块,分别对准win和l键,每当合上笔记本时就...嘿嘿 查了MSDN,系统级的电源事件消息只有两个:WM_POWERBROADCAST,WM_POWER(已废弃),估计本本的开盖合盖事件要通过设备驱动去检测吧。 WM_POWERBROADCAST里好像不响应,本本合上的时候,屏幕是不是会关掉?是否可以从这里下手?jpexe,很喜欢你写的那个任务管理器!呵呵! 在笔记本上粘两个硬块,分别对准win和l键,每当合上笔记本时就...嘿嘿顶有创意。 感谢oloveuxyz大哥的回复,确实给了我一些灵感……但是我确实想把系统响应这一动作的原理搞懂,不然很容易导致编写的程序误操作~请问您是否知道这一原理或者知道相关资料给小弟推荐学习一下?不胜感激…… 终于阻止了系统待机了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想要的 锁定计算机 可以自己实现,比较简单! 过了几天终于又看到有新的东西出来,不过21楼的方法还是不行的,这样只是盲目地阻止系统“休息”,而LZ要的是能“准确响应”或者“检测”是否关闭盖子(Lid Off),这个并不符合LZ的需求。 恩 是的,这样不能坚持到否关闭盖子(Lid Off),我这样做的,是想在设置为合上的时候待机的情况下,阻止待机。 哈哈,很期待得到检测是否关闭盖子的方法! 年底到了,合同期也就要到了,我不知道签还是不签?(散分) 紧急求救!!!关于表格导出的方法 请问Delphi中某具体控件如何得到外部拖放的文件路径 关于业务逻辑与数据库分离的问题。 音量与静音控制 怎样在delphi中把指针传到VC写的DLL中? 中国历代皇帝 Paradox数据追加 是不是所有的网页上的操作都能转化成提交一张表单的操作? 高手们来看看这个奇怪的类型声明 有用VISA32开发过读取频谱仪的波形并且显示到chart中的程序没。 DbGridEh单元格多选后如何获取选中了哪些行,并且取得关键字的值
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
这个不是Windows消息,是通过程序控制的,可以通过控制面板电源选项或单独程序(如ThinkPad的电源管理器)进行设置
wm_powerbroadcast 只是一个捕获电源事件的消息!
http://msdn.microsoft.com/zh-cn/magazine/cc163386.aspx
顶有创意。
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想要的 锁定计算机 可以自己实现,比较简单!
恩 是的,这样不能坚持到否关闭盖子(Lid Off),我这样做的,是想在设置为合上的时候待机的情况下,阻止待机。 哈哈,很期待得到检测是否关闭盖子的方法!