You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取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;
}

补充注意事项

  1. 无窗口进程处理:IsHungAppWindow仅对有消息队列的GUI进程有效,后台服务等无窗口进程不会被标记为未响应,与任务管理器逻辑完全一致。
  2. 批量监控扩展:若需监控所有进程,可结合CreateToolhelp32Snapshot枚举系统所有进程,再逐个调用上述判定方法。
  3. 权限要求:OpenProcess需要PROCESS_QUERY_INFORMATION和PROCESS_VM_READ权限,部分系统进程可能需要管理员权限才能访问。

内容的提问来源于stack exchange,提问作者Vector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 18:50:01