获取Windows进程状态(含未响应)的API有哪些?适用于Delphi/C++
检测Windows进程“未响应”状态的核心API与实现思路
核心逻辑与API说明
任务管理器的“未响应”判定本质是检查进程的窗口消息队列是否堵塞(仅针对带GUI窗口的进程,无窗口进程不存在该状态),核心依赖以下Windows API:
IsHungAppWindow:直接判定指定窗口所属进程是否未响应,底层实现就是检测窗口消息队列是否超过5秒未处理消息。GetWindowThreadProcessId:通过窗口句柄关联到对应进程ID,用于窗口与进程的绑定。EnumWindows/GetWindow:枚举系统顶层窗口,遍历查找目标进程的所有窗口。OpenProcess:获取进程句柄,用于补充获取进程名称等元信息。GetModuleFileNameEx:通过进程句柄提取可执行文件路径/名称。
Delphi 实现示例
uses Windows, PsAPI; function IsProcessNotResponding(const ProcessID: DWORD): Boolean; var hWnd: HWND; TargetPID: DWORD; begin Result := False; // 遍历桌面子窗口,查找目标进程的窗口 hWnd := GetWindow(GetDesktopWindow(), GW_CHILD); while hWnd <> 0 do begin GetWindowThreadProcessId(hWnd, @TargetPID); if TargetPID = ProcessID then begin // 只要进程有一个窗口未响应,标记进程为未响应 if IsHungAppWindow(hWnd) then begin Result := True; Break; end; end; hWnd := GetWindow(hWnd, GW_HWNDNEXT); end; end; // 使用示例 var hProcess: THandle; TargetPID: DWORD; begin TargetPID := 1234; // 替换为目标进程ID hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, TargetPID); if hProcess <> 0 then try if IsProcessNotResponding(TargetPID) then Writeln('进程未响应') else Writeln('进程正常响应'); finally CloseHandle(hProcess); end; end.
C++ 实现示例
#include <windows.h> #include <psapi.h> #include <iostream> BOOL IsProcessNotResponding(DWORD processID) { HWND hWnd = GetWindow(GetDesktopWindow(), GW_CHILD); while (hWnd != NULL) { DWORD targetPID; GetWindowThreadProcessId(hWnd, &targetPID); if (targetPID == processID) { if (IsHungAppWindow(hWnd)) { return TRUE; } } hWnd = GetWindow(hWnd, GW_HWNDNEXT); } return FALSE; } // 使用示例 int main() { DWORD pid = 1234; // 替换为目标进程ID HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); if (hProcess != NULL) { IsProcessNotResponding(pid) ? std::cout << "进程未响应" << std::endl : std::cout << "进程正常响应" << std::endl; CloseHandle(hProcess); } return 0; }
补充注意事项
- 无窗口进程处理:
IsHungAppWindow仅对有消息队列的GUI进程有效,后台服务等无窗口进程不会被标记为未响应,与任务管理器逻辑完全一致。 - 批量监控扩展:若需监控所有进程,可结合
CreateToolhelp32Snapshot枚举系统所有进程,再逐个调用上述判定方法。 - 权限要求:
OpenProcess需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限,部分系统进程可能需要管理员权限才能访问。
内容的提问来源于stack exchange,提问作者Vector
相关产品推荐
相关产品推荐

