XP系统关机消息是什么?(100分)

  • 主题发起人 主题发起人 bjaman
  • 开始时间 开始时间
B

bjaman

Unregistered / Unconfirmed
GUEST, unregistred user!
message WM_POWERBROADCAST = 536;//键盘Power键或系统关机的广播消息
这个消息在2000下可以正常截获,但是在XP下测试却根本不会进入消息处理过程。难道XP下有别的关机广播消息?是什么呢?
WM_POWER = $0048消息是做什么用的?
 
这是一个自动关机的程序 里面有 你想要的功能!

unit AutoShut1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Menus,AppEvnts,shellapi;
type
TForm1 = class(TForm)
Timer1: TTimer;
Timer2: TTimer;
ApplicationEvents1: TApplicationEvents;
PopupMenu1: TPopupMenu;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Btn_OK: TButton;
Btn_Abort: TButton;
procedure Timer1Timer(Sender: TObject);
procedure TrayMenu(Var Msg:TMessage); message WM_USER;
procedure TimeSetClick(Sender: TObject);
procedure ExitClick(Sender: TObject);
procedure Btn_OKClick(Sender: TObject);
procedure Btn_AbortClick(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure Edit2KeyPress(Sender: TObject; var Key: Char);
procedure WMQueryEndSession (var Msg : TWMQueryEndSession);
message WM_QueryEndSession;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
{ Private declarations }
Tray:NOTIFYICONDATA;
procedure ShowInTray();
public
{ Public declarations }
end;

var
Form1: TForm1;
P,Ti1:Pchar;
Flags:Longint;
i:integer;
{关机延迟时间}
TimeDelay:integer;
atom:integer;
implementation
{$R *.dfm}

{未到自动关机时间,系统要关闭时,截获关机消息
wm_queryendsession,让用户决定是否关机}
procedure TForm1.WMQueryEndSession (var Msg : TWMQueryEndSession);
begin
if MessageDlg('真的要关闭Windows吗?',mtConfirmation,[mbYes,mbNo], 0) = mrNo then
Msg.Result := 0
else
Msg.Result := 1;
end;

{判断时间S格式是否是有效}
function IsValidTime(s:string):bool;
begin
if Length(s)<>5 then IsValidTime:=False
else
begin
if (s[1]<'0') or (s[1]>'2') or (s[2]<'0') or
(s[2]>'9') or (s[3] <> ':') or
(s[4]<'0') or (s[4]>'5') or
(s[5]<'0') or (s[5]>'9')then IsValidTime:=False
else
IsValidTime:=True;
end;
end;

{判断是哪类操作系统,以确定关机方式}
function GetOperatingSystem: string;
var osVerInfo: TOSVersionInfo;
begin
Result :='';
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo) then
case osVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
Result := 'Windows NT/2000/XP'
end;
VER_PLATFORM_WIN32_WINDOWS:
begin
Result := 'Windows 95/98/98SE/Me';
end;
end;
end;

{获得计算机名}
function GetComputerName: string;
var
buffer: array[0..MAX_COMPUTERNAME_LENGTH + 1] of Char;
Size: Cardinal;
begin
Size := MAX_COMPUTERNAME_LENGTH + 1;
Windows.GetComputerName(@buffer, Size);
Result := strpas(buffer);
end;

{定时关机函数 ,各参数的意义如下:
Computer: 计算机名;Msg:显示的提示信息;
Time:时间延迟; Force:是否强制关机;
Reboot: 是否重启动}
function TimedShutDown(Computer: string; Msg: string;
Time: Word; Force: Boolean; Reboot: Boolean): Boolean;
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
{获得用户关机特权,仅对Windows NT/2000/XP}
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then
begin
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
tkp.PrivilegeCount := 1;
AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
end;
Result := InitiateSystemShutdown(PChar(Computer), PChar(Msg), Time, Force, Reboot)
end;

{窗体最小化后,显示在托盘中}
procedure tform1.ShowInTray;
Begin
Tray.cbSize:=sizeof(Tray);
Tray.Wnd:=Self.Handle;
Tray.uFlags:=NIF_ICON+NIF_MESSAGE+NIF_TIP;
Tray.uCallbackMessage:=WM_USER;
Tray.hIcon:=application.Icon.Handle ;
Tray.szTip:='定时关机';
Shell_NotifyIcon(NIM_ADD,@Tray);
End;

{右键单击托盘中的图标,显示快捷菜单}
procedure Tform1.TrayMenu(var Msg:TMessage);
var
X,Y:Tpoint;
J,K:Int
 
谢谢maikee1978的答复,并提供了一些系统控制方面的资料。
我的情况可能与你所述有些不同,我现在的情况是:
键盘上有一个Power键,一不小心按了它,当前正在做的事情就报废了,因为电脑立刻就关机了,连个保存资料的机会都没有。我在2000下通过拦截消息:WM_POWERBROADCAST 来终止关机进程,是有效的。可是我现在的OS是XP,这就不行了,这个消息处理过程OS连理都不理。您所提到的消息:WM_QueryEndSession我刚试过了,XP还是不理,直接关机。
请继续关注此问题!
 
中cmos里关掉power键建就可以了。哪那么多,要不就扣掉。哈
 
呵呵~~~~正是不想抠掉键盘才写代码呀,抠掉那玩意儿多难看.....不太象个程序员要做的事情哦!
CMOS我打开试试看....
 
把电源管理-》高级-》按下计算机关闭按钮 改为 问我要做什么 也行。
据说,power键的优先级在xp中极高,低层键盘钩子都不能载获,因此比较难,以前有人问过,大富翁论坛的老二wjiachun答:扣掉。
 
把电源管理-》高级-》按下计算机关闭按钮 改为 问我要做什么
==========>>>这样的确可以达到目的.请到http://www.delphibbs.com/delphibbs/dispq.asp?lid=3607564 领分

不过既然MS可以监控到关机消息,我就更加好奇了,一定会有监控的办法的.
很想知道!如果有兴趣,请继续关注使用代码来监控XP的关机操作.....
 
考虑用代码从那三个键的驱动着不知行不行,那三个键相关驱动vxd/wdm。你试试看,我没空试了。
 
把你的键盘上的Power键拔掉 或者弄坏它 不就行了 哈哈
 
把你的键盘上的Power键拔掉 或者弄坏它 不就行了 哈哈
========>>>这不象程序员应该说的话吧?[:)]
玩笑! 请大家继续关注.....
系统环境:XP; 关机操作:机箱电源按钮 或者 键盘Power键
用代码如何监控?获得象:“电源管理-》高级-》按下计算机关闭按钮 改为 问我要做什么”之后的效果...
 
UP/////////////////
 
扣掉那三个按钮几乎就是买新键盘要做的第一件事
 
一再说过,抠掉键盘按键不是一个程序员应该考虑的事情!怎么还有这样顽固的论调出现呢?晕...........
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
private
procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;

{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.QueryEndSession(var Msg: TMessage);
begin
Msg.Result:=0;
end;

end.
 
WM_QueryEndSession消息在XP环境下,按关机钮是没反应的
 
哦,我也有
 
这个你要用最新的WINDOWS 消息去查看去实现.
 
必须弄清原理找WM_打头的所要消息,找找
 
谢谢wgz111111_001与我在QQ上交流!结贴吧
 

Similar threads

I
回复
0
查看
582
import
I
I
回复
0
查看
617
import
I
I
回复
0
查看
635
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
后退
顶部