您好,请教Windows系统消息 ,谢谢(20分)

  • 主题发起人 主题发起人 驿路的梦
  • 开始时间 开始时间
驿

驿路的梦

Unregistered / Unconfirmed
GUEST, unregistred user!
您好,windows系统 关机、重启、注销 东作相应的消息是哪些(windows 2000) ? ,
在哪里可以找到与windows消息相关的资料 ? 谢谢
 
procedure WMQUERYENDSESSION(var msg: Tmessage); message WM_QUERYENDSESSION;

procedure tmainf.WMQUERYENDSESSION(var msg: Tmessage); //截获WINDOWS 关机/注销重启信息
begin
if (msg.WParamLo = 0) and (msg.WParamhi = 0) then
begin
//截获WINDOWS 关机/注销重启信息//截获WINDOWS 关机/注销重启信息
end;
end;
 
Windows关机时会向每个应用程序发送WM_QUERYENDSESSION消息。

 
dangbochang, : 您好,中间哪儿怎么判断是关机、重启或者注销消息 ? 三个应该有区别的

谢谢
 
好象没区别,
 
没区别 ? 不会吧,关机、重启、注销 是三个不同的动作
 
我试过了,好象是关机、重启或者注销时,那IF语句后的代码都会执行??
我也感觉很奇怪啊!
 
怎么会这样 ? 三个应该有区别的吧

等待......这些资料太少了...
 
var
Form1: TForm1;
logoff: boolean = false;
reboot: boolean = false;
warn: boolean = false;
downQuick: boolean = false;
cancelShutdown: boolean = false;
powerOff: boolean = false;
timeDelay: integer = 0;

implementation

{$R *.dfm}

function HasParam(Opt: Char): Boolean;
var
x: integer;
begin
result := false;
for x := 1 to paramCount do
if (paramstr(x) = '-'+opt) or (paramstr(x) = '/'+opt) then result := true;
end;

function GetErrorString: String;
var
lz: Cardinal;
err: array[0..512] of Char;
begin
lz := GetLastError;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, lz, 0, @err, 512, nil);
result := string(err);
end;

procedure Tform1.DoShutdown ;
var
rl,flgs: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
flgs := 0;
if downQuick then flgs := flgs or EWX_FORCE;
if not reboot then flgs := flgs or EWX_SHUTDOWN;
if reboot then flgs := flgs or EWX_REBOOT;
if poweroff and (not reboot) then flgs := flgs or EWX_POWEROFF;
if logoff then flgs := (flgs and (not (EWX_REBOOT or EWX_SHUTDOWN or EWX_POWEROFF))) or EWX_LOGOFF;
if Win32Platform = VER_PLATFORM_WIN32_NT then begin
if not OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
label2.Caption :='正在关机...'
else begin
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);
if GetLastError <> ERROR_SUCCESS then
label2.Caption :='正在关机...';
end else label2.Caption :='正在关机...';
end;
if CancelShutdown then
if AbortSystemShutdown(nil) = False then
label2.Caption :='正在关机...'
else
label2.Caption :='正在关机...'
else begin
if InitiateSystemShutdown(nil, nil, timeDelay, downQuick, Reboot) = False then
label2.Caption :='正在关机...'
else
label2.Caption :='正在关机...';
end;
end
else begin
ExitWindowsEx(flgs, 0);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if Application.Messagebox(PChar('你确认要关闭计算机吗?'),Pchar('请确认'),MB_YesNO) = IDYES then
begin
downQuick := true;
DoShutdown;
end;
end;
 
谢谢楼上,不过你用的是 API ,我想更多的学习 windows 消息
 
关闭Windows
控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数
首先定义常数

const EWX_FORCE=4; //关闭所有程序并以其他用户身份登录 EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式 EWX_REBOOT=2; //重新启动计算机 EWX_SHUTDOWN=1;//关闭计算机


运行时给How赋值,让他等于EWX_SHUTDOWN或其他,调用以下语句

ExitWindowsEx(How,0);
 
不要 API ,在 WinNT, 2000 下还要得到权限

用消息处理
 
Win2000 下关机 也不用截获消息呀!
一个api 搞定拉。
 
楼上您好,我现在需要知道关机消息,需要截获它做点处理

请指导 ,谢谢
 
其实关机跟重启对于你的程序来说是没有什么两样的,注销倒是跟前两者有所不同。
因此,WINDOWS消息也只区分了注销、关机/重启两种情况,可以用消息:
WM_QUERYENDSESSION、WM_ENDSESSION的LParam参数与ENDSESSION_LOGOFF做位运算来比较
系统是注销还是关机。
 
找个msdn,查一下。
 

Similar threads

S
回复
0
查看
841
SUNSTONE的Delphi笔记
S
S
回复
0
查看
822
SUNSTONE的Delphi笔记
S
I
回复
0
查看
589
import
I
后退
顶部