C# Windows 程序退出请求(检测 Application.Exit)无表单

标签 c# winapi

是否可以检测一次 Application.Exit 被调用,或者是否有一个 win32 函数来知道 Windows 何时因为关闭或其他原因而关闭您的程序。没有表格。

最佳答案

请参阅 MSDN 文档以了解 WM_QUERYENDSESSIONWM_ENDSESSION消息; WM_ENDSESSION 消息的参数将告诉您应用程序是正常退出还是因为 Windows 正在关闭。您可以通过重写表单中的 WndProc 方法来处理这些消息,例如:

public partial class MainForm : Form
{
    private const int WM_ENDSESSION = 0x0016;
    private const uint ENDSESSION_CLOSEAPP = 0x1;
    private const uint ENDSESSION_CRITICAL = 0x40000000;
    private const uint ENDSESSION_LOGOFF = 0x80000000;
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == WM_ENDSESSION)
        {
            var sessionEnding = m.WParam.ToInt32() != 0;

            if ((m.LParam.ToInt64() & ENDSESSION_CLOSEAPP) == ENDSESSION_CLOSEAPP)
            {
                // App closing
            }
            if ((m.LParam.ToInt64() & ENDSESSION_CRITICAL) == ENDSESSION_CRITICAL)
            {
                // Critical error
            }
            if ((m.LParam.ToInt64() & ENDSESSION_LOGOFF) == ENDSESSION_LOGOFF)
            {
                // User logging off
            }

            m.Result = IntPtr.Zero;
        }
        else
        {
            base.WndProc(ref m);
        }
    }
}

关于C# Windows 程序退出请求(检测 Application.Exit)无表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100393/

相关文章:

c++ - SendInput (C++) 不起作用

c# - EMGU 2.4.0 BruteForceMatcher KNNMATCH 不工作?

c# - 在 Windows Vista, 7, 2008 中正常关闭控制台应用程序

win32 DELPHI 中的 LINQ

c++ - 使用 RegEnumValue 显示值名称和数据

c - 开放管道上 CloseHandle 上的 sigsegv

c# - 在下载完成或下载 1MB 之前,WinRT DownloadOperation 不会返回任何内容

c# - 为什么没有隐式typeof?

c# - 如何在不知道区域的情况下通过标签从缓存中获取项目

c# - 利用 BackGroundWorker 跨线程调用 Winforms 控件上的 GUI 操作?