4

不幸的是,当您收听 WM_QUERYENDSESSION 时,如果用户请求重新启动或关闭,您不会获得信息。这是一个非常糟糕的设计,但它就是 Windows 的方式,所以我正在考虑将调用挂钩到 NTShutdownSystem,它获取一个参数,告诉系统执行重新启动或关闭。

问题是:如何在 C# 中实际实现这一点?我想获得某种挂钩,我可以使用它来确定传递给 NTShutdownSystem 的参数,然后保存该信息。之后,我想按照用户想要的方式调用“真正的”NTShutdownSystem。

你有任何示例代码来说明这一点吗?

4

1 回答 1

1

之所以WM_QUERYENDSESSION没有给出关机原因,是因为当时用户可能只是正在注销,而不是关闭系统。

这通常属于内核级挂钩的类别,并且通常被认为不是一件好事,因为它会影响系统的稳定性。它们中的大多数是用 C 或 C++ 编写的,并且通常必须付出很多努力才能在所有正在执行的程序中执行挂钩 - 例如在程序加载时挂钩例程。

这不是一件小事,但是已经编写了一些框架来帮助尝试使用托管代码(例如 C#)挂钩这样的例程

下一个要问的问题是你为什么在乎?

编辑NTShutdownSystem 在关机过程中很晚才被调用——那时你可能没有 UI,也没有办法做任何事情。我建议拦截ExitWindowsExInitiateShutdownInitiateSystemShutdownInitiateSystemShutdownEx - 我不知道其中一些是否被另一个调用,但您应该只记录原因,然后在WM_QUERYENDSESSION标准应用程序的代码中对原因做出反应。

于 2012-05-30T10:53:57.200 回答