Windows 8关机过程与Vista不同?

时间:2012-12-06 11:49:10

标签: windows winapi windows-8 shutdown

我有应用程序,应该在关机时做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;
}

3 个答案:

答案 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_QUERYENDSESSIONWM_ENDSESSION是不够的,还有新的API函数可以与关机过程进行交互。

答案 2 :(得分:-1)

此外,在调用ShutdownBlockReasonCreate()时提供的自定义字符串似乎未在Windows 8 / 8.1中更新。它只显示初始字符串,但没有更新。我试图让用户知道为什么以及我要阻止关机的时间。