将Ctrl + C事件发送到在Windows上使用QProcess启动的进程

时间:2014-03-07 16:46:48

标签: c++ windows qt qt5 qprocess

我有一个对话框,充当控制台应用程序的配置程序。该对话框的工作是为用户提供一组小部件(镜像控制台应用程序支持的选项),当用户单击“开始”按钮时,该对话框创建并启动一个QProcess,控制器应用程序的名称和参数基于GUI中小部件的状态。我能够成功启动这个过程,一切正常。但是,当我想要终止进程时,控制台应用程序需要正常关闭,这意味着它必须关闭文件,刷新数据,关闭设备等,然后终止。

我使用了QProcess :: close(),这会立即杀死应用程序而应用程序无法正常关闭。

我已经使用Win32 GenerateConsoleCtrlEvent(CTRL_C_EVENT, Q_PID::dwProcessId)向同一个发送了一个偶数。我看到上面的API返回一个非零值(表示成功,它会在失败时返回0),但我的进程继续运行。

任何人都可以帮助我如何发信号通知QProcess优雅地关机吗?或者还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

GenerateConsoleCtrlEvent会获取进程 ID,而非进程ID。您可能正在为其提供流程ID,因为这是QProcess提供的内容。

QProcess目前不支持创建流程组。您需要使用winapi手动启动该过程,或修补Qt副本以修改qtbase/src/corelib/io/qprocess[.h,.cpp,_win.cpp]以传递CREATE_NEW_PROCESS_GROUP创建标记。

如果您不想调整Qt本身,可以将qprocess文件复制到项目中,重命名该类,然后在其中添加更改。