2

我的应用程序应该在关机时执行 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;
}
4

3 回答 3

1

Vram 您可以使用 VS2012 中包含的新调试过程,请参阅链接:VS 2012 中的调试功能。由于 Windows 8 以不同的方式强制执行状态,因此这些调试工具可能会帮助您检测到问题。希望这对你来说不是新闻。

如果您可以发布一个演示您正在调试的问题的代码示例,那就更容易了。

在我的研究过程中,我也使用了这个链接,但可能不是很有用:WM_ENDSESSION

于 2012-12-06T17:42:53.670 回答
1

是的,关机逻辑已更改,但在 Windows 8 中未更改。在 Vista 中已更改,更改记录在 MSDN 上:

Windows Vista 中的应用程序关闭更改

WM_QUERYENDSESSION仅仅处理和单独是不够的WM_ENDSESSION,还涉及到与关闭过程交互的新 API 函数。

于 2012-12-07T01:27:11.450 回答
-1

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

于 2014-07-14T11:23:30.877 回答