在使用Qt 4.8的C ++代码中,我使用以下代码:
QProcess::startdetached(QString("explorer /select, \"%1\"").arg(fileName));
其中fileName是在QTextEdit字段中选择的文件的路径。
工作正常; Windows将打开一个包含该文件的文件夹窗口。
但是,如果我使用不同的文件名多次调用它,则每次Windows打开一个新窗口。
是否可以只使用一个(当然,如果文件夹相同)?
答案 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)));
}
这样,就可以了!