c++ - 如何使用 QProcess 在控制台窗口中启动和稍后终止 cmd.exe

标签 c++ qt qprocess

我需要通过 QProcess 运行一个可见的 cmd.exe 窗口,并最终终止它。 shell 的控制台窗口必须位于前台并且必须对用户可见。

如果我使用 QProcess::start() 启动它,控制台窗口永远不会出现。如果我使用类方法QProcess::startDetached() 启动它,我不能使用实例方法terminate() 来终止它。

最佳答案

在 Windows 上,QProcess 有两种操作模式:

  1. 当您使用 实例方法 时的正常模式,例如 start()。在这种模式下,QProcess 本身是正在运行的应用程序的控制台,如果它请求的话。此控制台是一个逻辑对象(类似于 Unix 上的伪 tty)并且没有可见的外观。

  2. 使用类方法 startDetached 时的分离模式。如果正在运行的进程请求控制台,Windows 会为其提供一个控制台窗口。

因此,您利用 Windows 提供的控制台窗口的唯一选择是分离启动。

如果您希望在 cmd.exe 执行您的命令后留下一个打开的控制台窗口,以下适用:

  • 每个传递给执行的命令都需要在/k之前。

  • /k 和命令是单独的参数

要在应用程序退出时终止进程,您可以使用以下类的实例,作为应用程序实例的子实例:

#include <windows.h>
...
class ProcessKiller : public QObject {
  qint64 m_pid;
public:
  ProcessKiller(qint64 pid, QObject * parent = 0) : 
    QObject(parent), m_pid(pid) {}
  ~ProcessKiller() {
    HANDLE hApp = OpenProcess(PROCESS_QUERY_INFORMATION
                              | PROCESS_TERMINATE, FALSE, m_pid);
    if (hApp == NULL) return;
    TerminateProcess(hApp, NULL);
    CloseHandle(hApp);
  }
}

因此,要在 Windows 提供的控制台窗口中以两个 echo 命令开始运行 cmd.exe,并在应用程序退出时将其杀死,将是:

qint64 pid;
QProcess::startDetached("cmd.exe", QStringList()
  << "/k" << "echo foo"
  << "/k" << "echo bar",
  QDir::currentPath(), &pid);
new ProcessKiller(pid, qApp);

关于c++ - 如何使用 QProcess 在控制台窗口中启动和稍后终止 cmd.exe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22691272/

相关文章:

c++ - 通过指针访问三维数组

C++ 创建对象数组(来自不同类)

c++ - 在命名空间中使用枚举

c++ - 从 TCP 套接字读取

c++ - 当指定文件的路径包含空格时如何用QProcess启动explorer.exe?

c++ - 如何在 Qprocess 中运行 FFmpeg 命令以使其工作?

c++ - 一个vector<string *>可以不用new直接初始化吗?

python - 获取 QListWidget 中选定的行

c++ - 在 Qt 类实例中访问(非指针)成员变量时出现段错误

c++ - 如何将 qprocess 带到前面?