如何使用 Qt (C++) 通过名称检查程序是否正在运行。
会QProcess::pid
做这份工作吗?我不知道如何使用它。请建议。
如何使用 Qt (C++) 通过名称检查程序是否正在运行。
会QProcess::pid
做这份工作吗?我不知道如何使用它。请建议。
据我所知,QProcess 不允许您这样做(除非您自己生成了该进程),实际上 Qt 中没有任何内容。但是 Win32 API 提供了一种通过函数实现您想要的方法EnumProcesses
,Microsoft 网站上提供了如何使用它的完整示例:
http://msdn.microsoft.com/en-us/library/ms682623.aspx
要让您需要将 PrintProcessNameAndID 替换为以下函数:
bool matchProcessName( DWORD processID, std::string processName)
{
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
// Get a handle to the process.
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
PROCESS_VM_READ,
FALSE, processID );
// Get the process name.
if (NULL != hProcess )
{
HMODULE hMod;
DWORD cbNeeded;
if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod),
&cbNeeded) )
{
GetModuleBaseName( hProcess, hMod, szProcessName,
sizeof(szProcessName)/sizeof(TCHAR) );
}
}
// Compare process name with your string
bool matchFound = !_tcscmp(szProcessName, processName.c_str() );
// Release the handle to the process.
CloseHandle( hProcess );
return matchFound;
}
一种快速而肮脏的方法是只检查 的输出tasklist
,例如:
bool isRunning(const QString &process) {
QProcess tasklist;
tasklist.start(
"tasklist",
QStringList() << "/NH"
<< "/FO" << "CSV"
<< "/FI" << QString("IMAGENAME eq %1").arg(process));
tasklist.waitForFinished();
QString output = tasklist.readAllStandardOutput();
return output.startsWith(QString("\"%1").arg(process));
}
使用EnumProcesses
可能是一种更好的方法(即更“纯粹”;当然更高效),但这可能是“足够好”,只要它不是在大循环或其他东西中被调用。同样的想法也可以移植到其他平台,尽管命令工具和解析逻辑显然会有所不同。
//How to Run App
bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe");
qDebug() << "Run = " << ok;
//How to Kill App
system("taskkill /im CozxyLogger.exe /f");
qDebug() << "Close";