有没有办法区分Windows 7及更高版本中的关机和重启?

时间:2016-01-06 10:00:15

标签: windows delphi winapi windows-7

我希望我的程序在关闭Windows时向用户显示一条消息,但是当他注销或重新启动Windows时却不会。

我当前检测这些事件的代码如下所示:

type
  Tf_PreventShutdown = class(TForm)
  private
    procedure WMQueryEndSession(var _Msg: TWMQueryEndSession); message WM_QUERYENDSESSION;
  end;

[...]

procedure Tf_PreventShutdown.WMQueryEndSession(var _Msg: TWMQueryEndSession);
begin
  _Msg.Result := LParam(True);
  if (_Msg.Unused and ENDSESSION_CRITICAL) = 0 then begin
    if (_Msg.Unused and ENDSESSION_LOGOFF) <> 0 then begin
      Caption := 'PreventShutdown - Logoff';
      _Msg.Result := LParam(False);
    end else begin
      Caption := 'PreventShutdown - Shutdown or Reboot';
      _Msg.Result := LParam(False);
    end;
  end;
end;

(Delphi XE2)

这可以很好地区分注销和关机/重启但我发现无法区分关机和重启。有可能吗?如果是的话,怎么样?

this的答案建议从注册表中读取,但是注释表明它不适用于Windows 7,如果关闭是通过其他方式而不是通过Windows资源管理器启动的话。我的测试发现Windows 8.1中不存在此值(尚未尝试过Windows 7)。

编辑: 我想要实现的目标:

我的一些同事需要在某些日子回家之前做些事情(不是每天)。为此,他们不能关闭他们的计算机,而是重新启动它。

这个想法是阻止显示消息的关闭,但只有在某些情况下,其中一个是计算机正在关闭而不是重新启动。当然他们仍然可以自由地忽略这个消息并且无论如何都会关闭。这只是一个提醒。

由于这些同事中至少有一个没有正常工作时间并经常忘记发送电子邮件和其他通知,因此他关闭计算机的时间是我能想到的最好/最简单的。 (当然,这是一种有趣的方式。)

0 个答案:

没有答案