返回 FALSE 到 WM_QUERYENDSESSION 不能阻止 Windows7 关机

本文关键字:Windows7 关机 不能 QUERYENDSESSION FALSE WM 返回 | 更新日期: 2023-09-27 18:31:23

我正在MSDN上遵循以下示例代码,以防止Windows 7关闭,直到用户确认:

    private static int WM_QUERYENDSESSION = 0x11;
    private static bool systemShutdown = false;
    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg == WM_QUERYENDSESSION)
        {
            MessageBox.Show("queryendsession: this is a logoff, shutdown, or reboot");
            systemShutdown = true;
        }
        // If this is WM_QUERYENDSESSION, the closing event should be
        // raised in the base WndProc.
        base.WndProc(ref m);
    } //WndProc 
    private void Form1_FormClosing(System.Object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (systemShutdown)
        // Reset the variable because the user might cancel the 
        // shutdown.
        {
            systemShutdown = false;
            if (DialogResult.Yes == MessageBox.Show("My application",
                "Do you want to save your work before logging off?",
                MessageBoxButtons.YesNo))
            {
                e.Cancel = true;
            }
            else
            {
                e.Cancel = false;
            }
        }
    }

但是我面临的问题是在一台PC上,即使显示"queryendsession:这是注销,关机或重新启动"(因此收到WM_QUERYENDSESSION),Windows 7也不会等待用户的确认并快速关闭。在其他PC上,这些代码运行良好。所以我想知道发生了什么。谢谢。

顺便说一句:我试图直接发送 e.Cancel = false Form1_FormClosing但没有任何反应。系统关闭,没有等待。

返回 FALSE 到 WM_QUERYENDSESSION 不能阻止 Windows7 关机

这就是我上次想要防止窗口关闭时的做法:

Public Form1()
{
    InitializeComponent();
    SystemEvents.SessionEnding += SessionEndingEvtHandler;          
}
private void SessionEndingEvtHandler(object sender, SessionEndingEventArgs e)
{
    e.Cancel = true;
}