And here's the corresponding header file gameprocesswatcher.h :
void GameProcessWatcher::setOnProcessExit(std::function<void(DWORD)> callback) std::lock_guard<std::mutex> lock(m_mutex); m_onProcessExit = callback;
void GameProcessWatcher::stopWatching() m_isWatching = false; if (m_watchThread.joinable()) m_watchThread.join();
// Error handling std::string getLastError() const;
uintptr_t GameProcessWatcher::getModuleBaseAddress(const std::string& moduleName) const if (m_processId == 0) return 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE
bool GameProcessWatcher::writeMemory(uintptr_t address, const void* buffer, size_t size) const if (m_hProcess == nullptr) return false; SIZE_T bytesWritten; if (!WriteProcessMemory(m_hProcess, (LPVOID)address, buffer, size, &bytesWritten)) return false; return bytesWritten == size;
// Callbacks void setOnProcessExit(std::function<void(DWORD)> callback);
template<typename T> bool readValue(uintptr_t address, T& value) const return readMemory(address, &value, sizeof(T));
void GameProcessWatcher::closeProcessHandle() if (m_hProcess != nullptr) CloseHandle(m_hProcess); m_hProcess = nullptr; m_processId = 0;
bool GameProcessWatcher::isProcessRunning() const PROCESS_TERMINATE, FALSE, m_processId); if (hProcess == nullptr) return false; DWORD exitCode; bool isRunning = (GetExitCodeProcess(hProcess, &exitCode) && exitCode == STILL_ACTIVE); CloseHandle(hProcess); return isRunning;