我的应用程序应该在关机时执行 smth,我的意思是 - 当用户按下关机时,应用程序阻止关机,并做一些事情。我们通过处理 WM_QUERYENDSESSION 和 WM_ENDSESSION 来做到这一点。该工作在 WM_ENDSESSION 处理程序中完成。这在 Windows 7、XP 中完美运行。
问题如下 - 在 Windows 8 上,关机过程在大约 1 分钟后被取消 - 关机 UI 显示一段时间,带有我的原因字符串,然后系统进入启动屏幕。没有关机,什么也没有发生。我的应用程序仍在运行。起初我认为问题出在我们的应用程序中,但似乎系统对所有应用程序都以这种方式运行,而不仅仅是我们的应用程序。您可以自己检查,只需运行一些您知道会阻止关机的应用程序,然后执行关机(或注销)。您将看到关闭 UI,告诉您哪些应用程序正在阻止关闭。稍等一下,大约 60-90 秒后它就会消失 - 关机将被取消。
所以我想知道MS是否在Windows 8的关机过程中改变了一些东西?
编辑:我不能在这里发布实际代码,所以我会发布一个伪代码,以说明要点:
LRESULT CMainFrame::OnQueryEndSession(UINT, WPARAM , LPARAM lParam, BOOL& bHandled) {
m_bQueryEndSession = true;
bHandled = true;
return TRUE;
}
LRESULT CMainFrame::OnEndSession(UINT, WPARAM wParam, LPARAM lParam, BOOL& bHandled) {
BOOL bEnding = (BOOL)wParam;
if(!bEnding)
return 0;
if(m_bQueryEndSession && /*and some other checks*/ )
{
if (g_osver.dwMajorVersion >= 6) {
// of Vista and higher load User32.dll and call ShutdownBlockReasonCreate() here
}
{
// all important job is done here
// zzz
}
if (g_osver.dwMajorVersion >= 6) {
// of Vista and higher load User32.dll and call ShutdownBlockDestroy() here
}
}
bHandled = true;
return 0;
}