使用方法:
QMap<QString,qint64> app_pid;
getAllAppPidList( app_pid );
#include <tlhelp32.h>// for CreateToolhelp32Snapshot
#include <Psapi.h> // for GetModuleFileNameEx
#define FORMAT_PATH(path) path.replace(‘\\‘,‘/‘).toLower()
QString GetPathByProcessID(DWORD pid) { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (!hProcess) { //QMessageBox::warning(NULL,"GetPathByProcessID","无权访问该进程"); return ""; } WCHAR filePath[MAX_PATH]; DWORD ret= GetModuleFileNameEx(hProcess, NULL, filePath, MAX_PATH) ; QString file = QString::fromStdWString( filePath ); //QMessageBox::warning(NULL,"GetPathByProcessID ret=", QString::number(ret)+":"+file); CloseHandle(hProcess); return ret==0?"":file; } void UDPClient::getAllAppPidList(QMap<QString,qint64>& app_pid) { PROCESSENTRY32 pe32; pe32.dwSize = sizeof(pe32); HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hProcessSnap == INVALID_HANDLE_VALUE) { warningLabel->setText("CreateToolhelp32Snapshot调用失败"); return ; } BOOL bMore = Process32First(hProcessSnap,&pe32); while(bMore) { //printf("进程名称:%s\n",pe32.szExeFile); //printf("进程ID:%u\n\n",pe32.th32ProcessID); QString exeName = (QString::fromUtf16(reinterpret_cast<const unsigned short *>(pe32.szExeFile))); QString exePath = GetPathByProcessID( pe32.th32ProcessID ); exePath = FORMAT_PATH( exePath ); if( exePath.isEmpty() ) { warningLabel->setText("获取进程 " + exeName + " 路径失败"); } else { app_pid[exePath] = pe32.th32ProcessID; } bMore = Process32Next(hProcessSnap,&pe32); } CloseHandle(hProcessSnap); }
时间: 2024-11-03 21:50:56