我希望我的C++程序能夠掃描進程,並且在某個file.exe運行時,我希望我的程序執行某些操作(此處不相關)。你能幫我完成這項任務嗎?掃描進程並在發現特定情況時執行某些操作
我在網上找到了一些東西。這個可以嗎 ?
CreateMutex(NULL, FALSE, NAMEofTHEprocess_exe);
if (GetLastError() == ERROR_ALREADY_EXISTS)return 0;
我可以在我的程序中使用它嗎?我不知道Mutex是什麼。
我希望我的C++程序能夠掃描進程,並且在某個file.exe運行時,我希望我的程序執行某些操作(此處不相關)。你能幫我完成這項任務嗎?掃描進程並在發現特定情況時執行某些操作
我在網上找到了一些東西。這個可以嗎 ?
CreateMutex(NULL, FALSE, NAMEofTHEprocess_exe);
if (GetLastError() == ERROR_ALREADY_EXISTS)return 0;
我可以在我的程序中使用它嗎?我不知道Mutex是什麼。
這裏是正在運行的進程的基本枚舉在Windows中:
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
#define PSAPI_VERSION 1
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <sddl.h>
void ListProcesses()
{
DWORD aProcesses[1024], cbNeeded, cProcesses;
MEMORYSTATUSEX statex;
statex.dwLength = sizeof(statex);
::GlobalMemoryStatusEx(&statex);
::EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
cProcesses = cbNeeded/sizeof(DWORD);
for (size_t i = 0; i < cProcesses; ++i)
if(aProcesses[i] != 0)
std::cout << "PID: " << aProcesses[i] << ", Name: " << getProcessNameByID(aProcesses[i]) << std::endl;
}
您可以使用最終名稱查找與getProcessNameByID
做出決定。下面是getProcessPathNameByID
代碼:
#include <tchar.h>
std::string getProcessNameByHandle(HANDLE hProcess)
{
if (NULL == hProcess)
return "<unknown>";
TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
HMODULE hMod;
DWORD cbNeeded;
if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR));
return std::string(szProcessName);
}
std::string getProcessNameByID(DWORD processID)
{
HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
std::string result = getProcessNameByHandle(hProcess);
::CloseHandle(hProcess);
return result;
}
呃... ...最常見的使用情況下爲了這個,我所記得的是一個病毒檢測時被加載的防病毒... –