获取其他进程的状态

本文介绍了一种通过调用未公开的IsHungAppWindow函数来判断窗口是否处于无响应状态的方法,并提供了一个示例程序,该程序能在Win9x和WinNT/2000系统上运行。
使用IsHungAppWindow函数可以实现。
以下代码调用了User32.dll中一个未公开的函数,所以要获取函数的地址,这个函数存在于Win 9x和Win NT/2000两个操作系统之中,但名字却不一样。在Win 9x为IsHungThread;在Win NT/2000中为IsHungAppWindow。
-----------------------------------------
#include <windows.h>
#include <stdio.h>

typedef BOOL(WINAPI *PROCISHUNGAPPWINDOW)(HWND);
typedef BOOL(WINAPI *PROCISHUNGTHREAD)(DWORD);

PROCISHUNGAPPWINDOW         IsHungAppWindow;
PROCISHUNGTHREAD         IsHungThread;

void main(int argc, char* argv[])
{
         if (argc<2)
         {
                 printf("Usage:\n\nishung.exe hWnd\n");
                 return;
         }
        
         HWND hWnd;
         sscanf(argv[1],"%lx",&hWnd);
        
         if (!IsWindow(hWnd))
         {
                 printf("没有找到窗口句柄\n");
                 return;
         }
        
         HMODULE hUser32 = GetModuleHandle("user32");
         if (!hUser32) return;
        
         IsHungAppWindow = (PROCISHUNGAPPWINDOW)GetProcAddress(hUser32,"IsHungAppWindow" );
         IsHungThread = (PROCISHUNGTHREAD) GetProcAddress( hUser32,"IsHungThread" );
        
         if (!IsHungAppWindow && !IsHungThread) return;
        
         OSVERSIONINFO osver;
         osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        
         if (!GetVersionEx(&osver)) return;
        
         BOOL IsHung;
        
         if (osver.dwPlatformId&VER_PLATFORM_WIN32_NT) IsHung = IsHungAppWindow(hWnd);
         else IsHung = IsHungThread(GetWindowThreadProcessId(hWnd,NULL));
        
         if (IsHung)
                 printf("没有响应\n");
         else
                 printf("正在运行\n");
}


---------------------------------------------------
获取进程的状态.exe 000D10EA
后面的参数是窗口的句柄,可以使用Spy++获取。
<think>我们已知用户想根据进程获取进程状态。我们可以使用psutil库来方便地实现跨平台操作。根据引用[2]中提到的psutil.Process对象,我们可以获取进程的各种信息,包括状态。 步骤: 1. 根据进程获取所有匹配的进程(因为可能有多个同名进程) 2. 遍历这些进程获取每个进程的状态(如运行中、睡眠、僵尸等) 3. 将状态信息返回 注意:进程状态在psutil中是用字符串表示的,例如: running: 运行中 sleeping: 睡眠(等待中) stopped: 停止 zombie: 僵尸 另外,如果找不到进程,则说明进程不存在。 我们也可以考虑使用系统命令(如Linux的ps)来实现,但为了跨平台,我们优先使用psutil。 根据引用[3]中的方法,我们也可以使用系统命令,但这里我们主要展示psutil方法,同时给出一个使用系统命令的备选方案(仅限Linux)。 方法一:使用psutil(推荐) 方法二:使用系统命令(仅Linux,参考引用[3]的方式,但注意引用[3]中使用了grep和ps,我们这里可以改进一下,直接使用ps命令检查进程状态) 由于用户要求根据进程名,所以我们需要通过进程名来查找。 我们分别实现两种方法,并说明优缺点。 注意:使用psutil需要安装,pip install psutil 下面我们编写代码:</think># Python 根据进程获取进程状态 在Python中,根据进程获取进程状态有几种可靠的方法,主要分为使用`psutil`库和系统命令两种方式。以下是详细实现方案: ## 方法一:使用 psutil 库(推荐 - 跨平台高效) ```python import psutil def get_process_status_by_name(process_name): """根据进程获取进程状态""" results = [] # 遍历所有进程 for proc in psutil.process_iter(['pid', 'name', 'status']): try: # 检查进程名是否匹配(不区分大小写) if process_name.lower() in proc.info['name'].lower(): # 获取进程详细信息 status = { 'pid': proc.info['pid'], 'name': proc.info['name'], 'status': proc.info['status'], 'create_time': proc.create_time(), 'cpu_percent': proc.cpu_percent(), 'memory_percent': proc.memory_percent() } results.append(status) except (psutil.NoSuchProcess, psutil.AccessDenied): # 跳过已结束或无法访问的进程 continue return results # 使用示例 process_name = "chrome" # 替换为目标进程名 status_list = get_process_status_by_name(process_name) if status_list: print(f"找到 {len(status_list)} 个'{process_name}'进程:") for i, status in enumerate(status_list, 1): print(f"\n进程 #{i}:") print(f" PID: {status['pid']}") print(f" 名称: {status['name']}") print(f" 状态: {status['status']}") print(f" 创建时间: {status['create_time']}") print(f" CPU使用率: {status['cpu_percent']}%") print(f" 内存使用率: {status['memory_percent']:.2f}%") else: print(f"未找到名为'{process_name}'的进程") ``` ### 输出示例: ``` 找到 8 个'chrome'进程: 进程 #1: PID: 1234 名称: chrome.exe 状态: running 创建时间: 1689876543.21 CPU使用率: 5.7% 内存使用率: 2.34% 进程 #2: PID: 5678 名称: chrome.exe 状态: sleeping 创建时间: 1689876545.78 CPU使用率: 0.3% 内存使用率: 1.87% ... ``` **优点**: - 跨平台支持(Windows/Linux/macOS) - 提供详细进程信息(状态、资源占用等) - 无需调用外部命令,执行效率高[^2] **安装**:`pip install psutil` ## 方法二:使用系统命令(无需额外安装) ### Linux/macOS 系统 ```python import subprocess import re def get_linux_process_status(process_name): """在Linux/macOS上根据进程获取状态""" try: # 使用ps命令获取进程信息 output = subprocess.check_output( ["ps", "-eo", "pid,stat,comm"], text=True ) results = [] pattern = re.compile(r'^\s*(\d+)\s+(\S+)\s+(.*)$', re.MULTILINE) for match in pattern.finditer(output): pid, status, name = match.groups() # 检查进程名是否匹配 if process_name.lower() in name.lower(): # 解析状态代码 status_map = { 'R': '运行中', 'S': '休眠中', 'D': '不可中断休眠', 'Z': '僵尸进程', 'T': '已停止', 't': '跟踪停止' } status_desc = status_map.get(status[0], '未知状态') results.append({ 'pid': int(pid), 'name': name, 'status': status_desc, 'status_code': status }) return results except subprocess.CalledProcessError: return [] # 使用方式同方法一 ``` ### Windows 系统 ```python import subprocess def get_windows_process_status(process_name): """在Windows上根据进程获取状态""" try: # 使用tasklist命令获取进程信息 output = subprocess.check_output( ["tasklist", "/FO", "CSV", "/NH"], text=True, creationflags=subprocess.CREATE_NO_WINDOW ) results = [] for line in output.splitlines(): if not line: continue # 解析CSV格式输出 parts = line.split('","') if len(parts) < 5: continue name = parts[0].strip('"') pid = parts[1].strip('"') status = parts[4].strip('"') # 检查进程名是否匹配 if process_name.lower() in name.lower(): results.append({ 'pid': int(pid), 'name': name, 'status': status }) return results except subprocess.CalledProcessError: return [] # 使用方式同方法一 ``` ## 进程状态说明 | 状态代码 | 含义 | 描述 | |----------|-----------------------|------| | running | 运行中 | 进程正在执行或准备执行 | | sleeping | 休眠中 | 进程在等待事件(如I/O完成) | | stopped | 已停止 | 进程被暂停(如收到SIGSTOP信号) | | zombie | 僵尸进程 | 进程已结束但父进程未回收 | | idle | 空闲(Windows特有) | 系统空闲进程 | | unknown | 未知状态 | 无法确定的状态 | ## 性能对比 | 方法 | 跨平台性 | 执行效率 | 信息详细度 | 依赖安装 | |------------|----------|----------|------------|----------| | `psutil` | ★★★★★ | ★★★★★ | ★★★★★ | 需要 | | 系统命令 | ★★★☆☆ | ★★☆☆☆ | ★★☆☆☆ | 无需 | > **推荐选择**:优先使用`psutil`库,它提供最全面的进程信息和跨平台支持,特别适合需要频繁查询或监控进程的场景[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值