• 16086阅读
  • 14回复

QT控制台程序,如何在关闭控制台时候,获取关闭控制台消息 [复制链接]

上一主题 下一主题
离线foxgod
 

只看楼主 倒序阅读 楼主  发表于: 2014-06-06
QT控制台程序,如何在关闭控制台时候,获取关闭控制台消息;
离线郑关耳

只看该作者 1楼 发表于: 2014-06-06
void QCoreApplication::aboutToQuit() [signal]
或通过QCoreApplication::exec返回判断。

只能试试看
离线dbzhang800

只看该作者 2楼 发表于: 2014-06-07
这个主要是和系统相关吧,Windows下安装系统钩子,unix下捕捉系统signal?
离线foxgod

只看该作者 3楼 发表于: 2014-06-16
回 dbzhang800 的帖子
dbzhang800:这个主要是和系统相关吧,Windows下安装系统钩子,unix下捕捉系统signal? (2014-06-07 11:37) 

我就是创建了一个控制台程序,在程序里面用process 调用一个exe,但是我关闭这个控制台的程序的时候,无法进入析构函数,所以想获取关系控制台消息,
离线foxgod

只看该作者 4楼 发表于: 2014-06-16
回 郑关耳 的帖子
郑关耳:void QCoreApplication::aboutToQuit() [signal]
或通过QCoreApplication::exec返回判断。
只能试试看 (2014-06-06 20:49) 

没有作用,点击控制台关闭的时候 ,QCoreApplication::aboutToQuit() 貌似没起作用
离线dbzhang800

只看该作者 5楼 发表于: 2014-06-17
回 foxgod 的帖子
foxgod:我就是创建了一个控制台程序,在程序里面用process 调用一个exe,但是我关闭这个控制台的程序的时候,无法进入析构函数,所以想获取关系控制台消息, (2014-06-16 11:26) 

这个,还是没看懂你的问题。

你是想在你的控制台程序内,捕捉“控制台”被杀死的信号?

还是在一个控制台程序内,捕捉通过QProcess启动的另一个"控制台程序"被杀死的信号?
离线foxgod

只看该作者 6楼 发表于: 2014-06-18
回 dbzhang800 的帖子
dbzhang800:这个,还是没看懂你的问题。
你是想在你的控制台程序内,捕捉“控制台”被杀死的信号?
....... (2014-06-17 15:13) 

关闭控制台后,捕获关闭消息,然后执行一段程序里面的代码。就想做这个事情。
离线foxgod

只看该作者 7楼 发表于: 2014-06-18
回 dbzhang800 的帖子
dbzhang800:这个,还是没看懂你的问题。
你是想在你的控制台程序内,捕捉“控制台”被杀死的信号?
....... (2014-06-17 15:13) 

关闭控制台后,捕获控制台被关闭消息,然后执行一段程序里面的代码。就想做这个事情。
离线dbzhang800

只看该作者 8楼 发表于: 2014-06-18
回 foxgod 的帖子
foxgod:关闭控制台后,捕获控制台被关闭消息,然后执行一段程序里面的代码。就想做这个事情。 (2014-06-18 11:29) 

还是没看懂你的要求。

比如说,你当前开有一个控制台(Windows下的cmd.exe 或者 Linux下的Bash或Dash)

在该控制台下,你运行一个非常耗时的程序,比如它叫 abcd

然后,在abcd运行过程中,你强制关闭了控制台程序。你是要在此时(在abcd内)捕捉系统发送的控制台被杀死的信号么?
离线彩阳

只看该作者 9楼 发表于: 2014-06-18
我才如果要关闭,是不是向console发送^z呢,看看能不能从管道中捕获^z。
上海Qt开发联盟,热忱地欢迎你的加入!
离线foxgod

只看该作者 10楼 发表于: 2014-06-18
回 dbzhang800 的帖子
dbzhang800:还是没看懂你的要求。
比如说,你当前开有一个控制台(Windows下的cmd.exe 或者 Linux下的Bash或Dash)
....... (2014-06-18 11:53) 

是的,就是这样
离线liuyuanan

只看该作者 11楼 发表于: 2014-11-19
我试过,如下方法可以实现:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include <stdio.h>

BOOL HandlerRoutine(DWORD dwCtrlType)
{
    switch (dwCtrlType)
    {
        case CTRL_C_EVENT:
            printf("ctrl+c\n") ;
            return TRUE;
        case CTRL_CLOSE_EVENT:
            printf("ctrl close\n") ;
            return TRUE;
        case CTRL_BREAK_EVENT:
            printf("CTRL_BREAK_EVENT\n") ;
        case CTRL_LOGOFF_EVENT:
            printf("CTRL_LOGOFF_EVENT\n") ;
        case CTRL_SHUTDOWN_EVENT:
            printf("CTRL_SHUTDOWN_EVENT\n") ;
        default:
            return FALSE;
    }
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    SetConsoleCtrlHandler((PHANDLER_ROUTINE)HandlerRoutine,TRUE);

    return a.exec();
}
离线foxgod

只看该作者 12楼 发表于: 2020-04-28
回 郑关耳 的帖子
郑关耳:void QCoreApplication::aboutToQuit() [signal]
或通过QCoreApplication::exec返回判断。
只能试试看 (2014-06-06 20:49) 

你说的这个函数,在window平台上触发不了这个函数
https://www.doc88.com/p-9109659704596.html   第10页说明
离线foxgod

只看该作者 13楼 发表于: 2020-04-28
回 liuyuanan 的帖子
liuyuanan:我试过,如下方法可以实现:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include <stdio.h>
....... (2014-11-19 19:24) 

试验了,确实可以获取各种关闭,还可以执行别的函数
离线foxgod

只看该作者 14楼 发表于: 2020-04-28
回 liuyuanan 的帖子
liuyuanan:我试过,如下方法可以实现:
#include <QtCore/QCoreApplication>
#include <windows.h>
#include <stdio.h>
....... (2014-11-19 19:24) 

不过如果起了多个子进程,子进程在做大量运算的时候,关闭窗口,这个函数HandlerRoutine()进不来。有什么解决的吗??
快速回复
限100 字节
 
上一个 下一个