拦截WM_ENDSESSION消息

时间:2016-02-05 18:24:15

标签: windows winapi system-shutdown

是否可以拦截WM_ENDSESSION消息以阻止其他应用程序接收它?

我想命令该应用程序在Windows重新启动或关闭之前执行其他操作,并且无法以这种方式配置应用程序。

该应用程序是屏幕录像机软件,它会在Windows关闭时丢弃视频。我需要阻止并保存视频。

1 个答案:

答案 0 :(得分:2)

  

是否可以拦截WM_ENDSESSION消息以阻止其他应用程序接收它?

技术上是的,使用来自SetWindowsHookEx()的消息钩子。根据所使用的挂钩,您有时可以修改(而不是丢弃)消息,使其看起来像其他消息,例如WM_NULL。但是,在WM_ENDSESSION的情况下,它只是一个通知,而不是请求,因此无论应用程序使用该消息做什么,Windows仍将继续关闭。

  

我希望命令该应用程序在Windows重新启动或关闭之前执行其他操作,并且无法以这种方式配置应用程序。

     

该应用程序是屏幕录像机软件,它会在Windows关闭时丢弃视频。我需要阻止并保存视频。

因此,您实际上并不想避免使用WM_ENDSESSION,您只是希望延迟其他应用程序处理它,直到您首先执行操作为止。

最好的选择是简单地联系录音机作者并请求添加一项功能以在系统关闭时保存视频。

除此之外,MSDN还说:

Application Shutdown Changes in Windows Vista

  

默认情况下,没有任何可见顶级窗口的应用程序在被终止之前将被给予5秒钟来处理WM_ENDSESSION。

     

如果您的应用程序响应WM_ENDSESSION可能需要5秒以上的时间来完成其关闭处理,它应该在其WM_QUERYENDSESSION处理程序中调用ShutdownBlockReasonCreate(),并立即响应TR_ WM_QUERYENDSESSION,以免阻止关闭。然后它应该在其WM_ENDSESSION处理程序中执行所有关闭处理。

     

通过这种方式,Windows会将您的应用程序视为具有可见的顶级窗口,并且会在30秒内处理WM_ENDSESSION。

因此,您可以尝试使用消息钩子拦截WM_QUERYENDSESSION并让它调用ShutdownBlockReasonCreate()并立即返回,然后拦截WM_ENDSESSION以调用视频保存操作并调用{{1当它完成。当然,假设录音机正在放弃视频,以回复ShutdownBlockReasonDestroy()而不是WM_ENDSESSION

有关Windows如何处理这两条消息的详细信息,请参阅MSDN:

Shutdown Changes for Windows Vista