我有应用程序,应该在关机时做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;
}
答案 0 :(得分:1)
Vram您可以使用VS2012中包含的新调试过程,请参阅链接:Debug features in VS 2012。由于Windows 8以不同的方式强制执行状态,因此可能存在这些调试工具可能帮助您检测的问题。希望这对你来说不是新闻。
如果您可以发布一个演示您正在调试的问题的代码示例,那会更容易。
在我的研究过程中,我也使用了这个链接,但可能不是很有用:WM_ENDSESSION
答案 1 :(得分:1)
是的,关闭逻辑已更改,但在Windows 8中没有更改。它在Vista中已更改,并且更改记录在MSDN上:
Application Shutdown Changes in Windows Vista
仅仅处理WM_QUERYENDSESSION
和WM_ENDSESSION
是不够的,还有新的API函数可以与关机过程进行交互。
答案 2 :(得分:-1)
此外,在调用ShutdownBlockReasonCreate()
时提供的自定义字符串似乎未在Windows 8 / 8.1中更新。它只显示初始字符串,但没有更新。我试图让用户知道为什么以及我要阻止关机的时间。