You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win32对话框作为主窗口时如何阻止系统关机?

解决方案

问题的核心是对话框窗口过程的默认处理逻辑错误:你之前对未处理的消息直接返回false,没有调用对话框专用的DefDialogProc默认窗口过程,导致系统无法正确识别该对话框为有效可见窗口,进而忽略你的关机拦截请求;而直接调用DefWindowProc会破坏对话框内部的消息处理机制,引发子对话框异常。

正确实现代码

INT_PTR CALLBACK DialogProc(HWND dialogHandle, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    case WM_QUERYENDSESSION:
        // 返回 FALSE 明确阻止系统关机请求
        return FALSE;
    case WM_ENDSESSION:
        // 确认阻止关机的后续处理,同样返回 FALSE
        return FALSE;

    // 示例:处理对话框关闭事件
    case WM_CLOSE:
        EndDialog(dialogHandle, 0);
        return TRUE;

    // 其他自定义消息处理...
    }
    // 未处理的消息必须交给 DefDialogProc 处理,这是对话框正常工作的关键
    return DefDialogProc(dialogHandle, message, wParam, lParam);
}

关键注意事项

  • 必须使用DefDialogProc处理未识别消息:对话框的内部状态维护(如子控件交互、模态逻辑)依赖该函数,直接返回false会导致系统判定窗口无效,从而跳过关机拦截逻辑。
  • 确保对话框是顶层可见窗口:
    • 非模态对话框创建后需调用ShowWindow(dialogHandle, SW_SHOW);
    • 资源编辑器中需确保对话框属性勾选Visible,或创建时显式设置可见性;
    • 避免将对话框作为子窗口嵌入其他容器。
  • 可选:提升关机通知优先级(增强可靠性)
    在程序初始化阶段调用SetProcessShutdownParameters,让你的程序优先收到关机消息:
    SetProcessShutdownParameters(0x400, SHUTDOWN_NORETRY);
    

内容的提问来源于stack exchange,提问作者Benjamin Krausse DB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 00:32:39