QProcess :: startdetached(QString(“ explorer / select,\”%1 \“”)。arg(fileName))

时间:2018-10-05 18:06:55

标签: c++ windows qt

在使用Qt 4.8的C ++代码中,我使用以下代码:

QProcess::startdetached(QString("explorer /select, \"%1\"").arg(fileName));

其中fileName是在QTextEdit字段中选择的文件的路径。

工作正常; Windows将打开一个包含该文件的文件夹窗口。

但是,如果我使用不同的文件名多次调用它,则每次Windows打开一个新窗口。

是否可以只使用一个(当然,如果文件夹相同)?

1 个答案:

答案 0 :(得分:0)

好吧,在网上进行了大量搜索之后,我发现了使用命令行TRAKLIST和TRAKKILL的线索。 (我正在使用SEVEN PRO 64) 一些尝试使用Windows控制台来了解如何在我的情况下使用它: -要在打开具有相同文件夹的新窗口之前知道已经打开的窗口的PID,我尝试了以下命令:     traklist / NH / FI windowtitle eq [folder_name]

使用/ NH避免标题,/ FI过滤器和选项windowtitle eq [folder_name],其中folder_name是文件夹的名称。

命令外给出PID:     explorer.exe 9244控制台1 32 908 Ko 此时,如果我输入命令:     trakkill / PID 9244 PID = 9244的过程停止并关闭窗口。

当我在Qt 4.8中使用C ++时,我在QPROCESS中插入了以下命令:

void MainWindow::testFenetre()
{
    QStringList args;
    QString cde;
    QString path = QFileInfo(m_win).absolutePath();//m_win complete path of the      selected file
    QString s = QFileInfo(path).baseName();//last part
    cde = "windowtitle eq " + s;
    args << "/NH" << "/FI" << cde;
    connect(&proc,SIGNAL(finished(int, QProcess::ExitStatus)),this,SLOT(processFinished(int, QProcess::ExitStatus)));
    proc.start("tasklist",args); //list of the current tasks -> filtered with the name of the window

}

用SIGNAL / SLOT连接过程我得到了PID,可以在打开一个新窗口之前关闭打开的窗口:

void MainWindow::processFinished(int exitCode, QProcess::ExitStatus exitStatus)
{
    m_buf = QString::fromUtf8(proc.readAllStandardOutput());
    m_buf.remove("\r\n");
    QString pid;

if (!m_buf.contains("Information")) //if m_buf = "Information..." -> no window to close
{
    QStringList sL = m_buf.split(QRegExp("\\s"),QString::SkipEmptyParts);
    if (sL.size()>1)
        pid = sL[1];// PID of the window if found
    else pid.clear();

    //close the window
    if (!pid.isEmpty())
        proc.start("taskkill",QStringList() << "/PID" << pid);
}
//to avoid recursivity when explorer show the new window
disconnect(&proc,SIGNAL(finished(int, QProcess::ExitStatus)),this,SLOT(processFinished(int, QProcess::ExitStatus)));

//open the new window indexed with m_win
QProcess::startDetached(QString("explorer /select,\"%1\"").arg(QDir::toNativeSeparators(m_win)));
}

这样,就可以了!