C++:响应 Windows 注销的清理操作

2024-01-12

我想捕获 Windows 注销事件,以便可以进行一些清理。我的WindowProc看起来像这样:

switch (uMsg){
case WM_ENDSESSION:
case WM_DESTROY:
    PostQuitMessage(0);
    return 0;
// other messages
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);

和消息循环WinMain看起来像这样:

for(;;){
    bool bTerminate = false;
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
        if(msg.message == WM_QUIT){
            bTerminate = true;
        }
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    if(bTerminate){
        break;
    }
    // do other stuff
    Sleep(10);
}
FILE * fout;
fopen_s(&fout, "C:\\success.txt", "w"); // simulating cleanup actions
fclose(fout);
ExitProcess(0);

预期的机制是WindowProc does PostQuitMessage,导致主消息循环接收WM_QUIT,打破循环并将程序发送到清理。当我退出程序时(从而发送WM_DESTROY)程序创建success.txt,但是当程序运行并且我注销时(发送WM_ENDSESSION), 它不是。

我看过WM_QUERYENDSESSION也一样,但是MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/aa376890%28v=vs.85%29.aspx说“每个申请都应该返回TRUE or FALSE收到此消息后立即执行,并推迟任何清理操作,直到收到WM_ENDSESSION信息。”


WM_ENDSESSION处理实际上并不给您的应用程序退出消息循环的机会。您应该假设系统在发送后调用 TerminateProcessWM_ENDSESSION信息。

因此,应用程序需要执行的任何清理工作都应该在从窗口过程返回之前完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:响应 Windows 注销的清理操作 的相关文章

随机推荐

  • 在Java编译器中,哪种类型可以定义为标识符(ID)或关键字(保留字)?

    我有一个简单的问题 在Java编译器中 哪些类型的方法或变量可以被定义为标识符 ID 或关键字 保留字 对于以下示例 ID 应为 add main a b c Test1 关于什么print is printID 或关键字 Example
  • Postgres - 返回 2 个数组的交集的函数?

    在 postgresql 中 如果两个数组具有公共成员 即它们重叠 则可以使用 运算符返回 t true 是否有一个函数 运算符可以返回这些常见成员的内容 即像这样 select arrray intersection ARRAY 1 4
  • 如何从自定义发行版中采样?

    我有一个发行版的pdf 该分布不是标准分布 R 中不存在可从中采样的函数 如何使用 R 从此 pdf 中进行采样 这更多的是一个统计问题 因为它需要采样 但一般来说 您可以采用这种方法来解决问题 查找发行版f 其 pdf 当乘以任何给定常数
  • Hibernate 中的通用 DAO 模式

    在处理 Hibernate 时 我们遵循 Hibernate Doc 中提到的通用 Hibernate DAO 模式 因此 我们目前正在维护两个并行的层次结构 1 对于接口 2 实施 因此 如果我们以这种方式工作 即使除了标准持久性方法之外
  • 如何在 xampp windows [php 7.2] 中安装/启用 GD?

    我不知道如何为 PHP7 2 安装 php gd 有没有办法在 xampp windows 中安装 启用 GD 扩展 我检查了 php ini 文件php gd2 dll但我找不到那条线 PHP7 2 中似乎缺少 GD 有什么建议么 转到
  • 是否可以使用指向参数数量未知的函数的指针?

    我正在编写一个简单的类来衡量函数在时间方面的性能 用户应该能够发送指向他的函数的指针 函数的参数 调用该函数的时间以及我将调用该函数的时间 返回经过的时间 我的问题是我不知道用户的函数需要多少个参数 我想使用可变参数函数来获取未知数量的参数
  • 运行 tf.estimator.train 100 步时,在张量板上仅看到一个步骤

    我有一个通过我自己的自定义构建的自定义估算器model fn 我想跑train并在张量板上查看每个步骤的数据点 但是 无论步骤数如何 每次调用我都只能看到一个数据点 以下是我构建和训练估算器的方法 estimator tf estimato
  • 以给定概率获取伪随机项

    我想在用户登录时给他一个奖品 但它需要有一些稀有的奖品 所以我想使用百分比以不同的机会出现奖品 我想显示其中之一 50 flower 30 book 20 mobile 使用他们拥有的百分比 如果有任何方法使用 Node js 或只是 ja
  • 我应该如何在 ECS 上设置 Traefik?

    简而言之 我已经成功跑了Traefik本地及上AWS ECS但现在我想知道应该如何设置某种负载平衡 以使我的两个具有随机 IP 的服务可供公众使用 我当前在 ECS 上的设置 Internet Load balancer on port 4
  • gcloud 未添加用于连接 GKE 集群的访问令牌

    我创建了一个 GKE 集群并使用以下命令连接到它kubectl运行针对我的集群单击 连接 按钮时出现的命令 gcloud container clusters get credentials cluster name zone us cen
  • SpringServletContainerInitializer 无法转换为 javax.servlet.ServletContainerInitializer

    我正在尝试将基于 xml 的 Spring MVC 应用程序移动到基于 Java 配置的应用程序 似乎与 maven 中可用的各种 java servlet 类不匹配 例如 有些提供 addServlet 方法 有些则不提供 这是我的配置类
  • VS 测试在管道中失败,缺少“Microsoft.NET.Test.Sdk”

    由于以下原因 我的构建失败了视觉工作室测试我的构建管道中的步骤失败 我有一个简单的 NET Core v2 1 类库和关联的 MS 测试库 我的管道有两个步骤 NET Core 构建步骤 以及 Visual Studio 测试步骤 这两个项
  • 将字符串移动到向量中

    有没有办法move将 std string 的内容转换为 std vector 我认为现在语言中有右值引用 这个操作有时会非常有用 It is 理论上可以从一种对象类型移动到另一种对象类型 然而 这些对象类型的设计必须允许这样做 vecto
  • 调整闪亮控件的标签位置

    令我惊讶的是 StackOverflow 上以前没有出现过这个问题 但无论如何 问题是 目前 标签文本 年龄范围 在此处指定 sliderInput inputId age Age Range min 32 max 99 value c 3
  • 为什么camel kafka Producer很慢?

    我使用 apache camel kafka 作为生成消息的客户端 我观察到 kafka 生产者需要 1 毫秒才能推送一条消息 如果我使用骆驼聚合将消息合并到批处理中 那么推送一条消息需要 100 毫秒 安装简述 3 kafka 集群 16
  • 仅在选定的列上使用 sklearn StandardScaler [重复]

    这个问题在这里已经有答案了 我有一个 numpy 数组 X 有 3 列 如下所示 array 3791 2629 0 1198760 113989 0 4120665 0 1 前 2 列是连续值 最后一列是二进制 0 1 我想仅将 Stan
  • 最快的 iPhone Blit 例程?

    我有一个UIView我需要将其位块传送到的子类UIImage 有多种方法可以给这只猫剥皮 具体取决于您喜欢使用哪个系列的 API 我对最快的感兴趣 可不可能是UIImage s drawAtPoint or drawRect 或者也许是基于
  • 如何在 JavaScript 中正确柯里化函数?

    我写了一个简单的curryJavaScript 中的函数在大多数情况下都能正常工作 const curry f a gt a length lt f length b gt curry f a b f a const add curry a
  • C - 将可变数量的命令行参数传递到具有可变数量参数的方法中

    我正在编写一个 C 程序 它将采用可变数量的命令行参数 然后 我需要获取这些参数并将它们传递到一个函数中 该函数将可变数量的文件名作为单独的参数 使用 va arg 获取函数内的参数 原型为 void FindFile char filen
  • C++:响应 Windows 注销的清理操作

    我想捕获 Windows 注销事件 以便可以进行一些清理 我的WindowProc看起来像这样 switch uMsg case WM ENDSESSION case WM DESTROY PostQuitMessage 0 return