【问题标题】:How to cancel WM_CLOSE on winEventFilter?如何取消 winEventFilter 上的 WM_CLOSE?
【发布时间】:2014-03-04 14:50:35
【问题描述】:

我创建了简单的handler inside my QApplication

bool QtMyApplication::winEventFilter ( MSG * msg, long * result ){
    switch(msg->message) {
        case WM_CLOSE:{
            qDebug() << "Haha Not killing appp =)";
            *result = 0;
            return true;
            break;
        }
    }
    return false;
}

然后我启动了我的应用程序,打开了任务管理器,在我的 qt 应用程序上调用了 End Task,并在几秒钟内收到了消息:

在我的QMainWindow 上实施QWidget WinEvent 也得到了相同的结果:

bool QMyMainWindow::winEvent(MSG *message, long *result)
{
    switch(message->message) {
        case WM_CLOSE:{
            qDebug() << "Haha Not killing appp =)";
            *result = 0;
            return true;
            break;
        }
    }

    return QMainWindow::winEvent(message, result);
}

笔记应用程序和任务管理器从AdministratorWindows Server 8 r2启动

所以我想知道如何处理任务管理器在QApplicationQMainWindow 上发送的WM_CLOSE 以使End Programm 消息不会显示?

【问题讨论】:

  • @ratchetfreak:我只想向用户显示我的窗口(允许在退出之前保存文件等)!

标签: c++ windows qt qt4 signals


【解决方案1】:

比寻找窗口系统关闭事件更好(和更少特定于平台)的方法是在主窗口中重新实现 Qt closeEvent 函数。假设您的应用程序设置了quitOnLastWindowClosed 标志,它会在窗口关闭后退出。

在你的主窗口代码中,实现closeEvent

void MainWindow::closeEvent(QCloseEvent *event)
{
    if(want_to_check)
    {
        int result = QMessageBox::critical(this, tr("Are you sure"),
                    tr("Are you sure you want to exit?"),
                    QMessageBox::Yes | QMessageBox::No);
            if(result==QMessageBox::Yes)
            {
                    // You can save files, etcetera, here
                    event->accept(); // The event is accepted, the window will close, and the application will exit
            }
            else
            {       // Your window will not close, and application will stay open
                    event->ignore(); // The window will stay open
            }
         }
    }

【讨论】:

  • 我也尝试使用 closeEvent - 遗憾的是任务管理器在大约 3 秒内显示 End Task 消息=(
【解决方案2】:

从 cmets 看来,真正的问题似乎是如何在任务管理器关闭文件之前询问用户有关保存文件的问题。这是一个奇怪的问题,因为从任务管理器关闭应用程序通常是最后的手段。

当用户尝试以常用方式关闭应用程序时,询问用户是否保存文件是完全合理的,例如从菜单中选择退出或单击主窗口上的关闭按钮。所以继续处理 WM_CLOSE 来做到这一点。

但请记住,还有许多其他方式可以终止进程。例如,用户可能会注销或关闭计算机,或者电源可能会熄灭,或者您的程序可能由于错误而崩溃,或者,用户可能会尝试从任务管理器中终止进程(可能是因为它挂起) .

在这些情况下,您实际上无法选择提出交互式问题。

选项 1:不询问就保存文件。您可以使用不同的文件名保存它,这样如果用户故意跳过保存,原始文件仍然可用。下次应用程序启动时,它可以检查这些“紧急保存”是否存在,然后询问用户他/她想要使用哪个副本。

选项 2:消除储蓄的概念。当用户编辑内存中的副本时,使文件保持最新。将所有内容都进行事务处理以使文件永远不会处于错误状态可能会很棘手,但它适用于某些类型的应用程序。

选项 3:间隔自动保存(这是实施选项 2 的简化方式)。这样,如果进程终止,用户只会丢失自上次自动保存以来的更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多