如何使用Qt(C++)检查程序是否按其名称运行
How to check if a program is running by its name with Qt (C++)
如何使用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";
在此处输入图像描述
相关文章:
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 不同/较旧的处理器运行c++代码的方式是否不同
- 在运行时检查继承是否只有一种类型和 void*
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 是否可以编译 Gtk+ 应用程序以同时在 Gtk 2 和 3 上运行
- 在 c++ 中是否允许创建具有运行时边界的数组?
- 是否可以在运行时强制转换模板参数?
- 在 C++ 中运行时调用模板时,是否可以切换模板的参数类型?
- MinGW是否需要在Visual Studio上运行C++
- 使用 int32_t 而不是双精度运行矢量点积是否更快?
- 如何检测窗口当前是否正在运行模式对话框?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- C++如何检查程序是否首次运行?
- 确定C++应用程序是否作为具有旧版支持的 UWP 应用运行
- 如何检查 ntpd 是否仍在运行和同步
- 如果事件在仍在执行时再次设置,RegisterWaitForSingleObject 是否会并行运行回调?
- 是否可以在运行时调用用于选择要调用的用户定义文本的逻辑?
- 是否需要在 Timer.5 boost::asio 教程中运行新线程?