通过API获取CPU/RAM使用情况(类似于任务管理器)?

3 投票
3 回答
4070 浏览
提问于 2025-04-18 02:33

有没有一种特定的方法可以通过Windows API获取“任务管理器”的信息?我查了很多资料,但似乎找不到可以告诉我以下信息的API调用:

  • 某个进程的CPU和内存使用情况
  • 哪个进程使用的CPU或内存最多

有没有办法通过Python或C++(基本上就是通过Windows API)来获取这些信息?

我基本上想做的事情是这样的(伪代码):

app x = winapi.most_intensive_process
app y = winapi.most_RAM_usage

print x.name
print y.name

3 个回答

2

你可以使用以下的Windows API来获取各种进程的计数器信息,这个适用于

它可以获取指定进程的内存使用情况。

BOOL WINAPI GetProcessMemoryInfo(
  _In_   HANDLE Process,
  _Out_  PPROCESS_MEMORY_COUNTERS ppsmemCounters,
  _In_   DWORD cb
);

在MSDN上有一个完整的例子,详细说明了如何使用这个API来获取你进程的信息。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050%28v=vs.85%29.aspx

你提到你想要持续获取这些信息(就像任务管理器那样,定时更新)。为了实现这个,你可以把MSDN中提到的完整逻辑写在一个函数里,然后在一定时间间隔后调用它(Sleep(1秒))。这样,你就能在程序运行期间不断获取这些信息。

4

你可以通过一些函数来获取关于内存使用情况的信息,特别是可以用EnumProcesses这个函数来找到系统中所有的进程,然后用GetProcessMemoryInfo来获取每个进程的内存使用情况。

如果你想知道每个进程的CPU使用情况,可以使用GetProcessTimes这个函数。虽然这个数据不一定完全准确,但我觉得任务管理器在相同情况下给出的结果也会有类似的不准确。

如果你需要的话,关于整个系统的内存使用情况的信息可以通过GetPerformanceInfo来获取。

4

与其直接调用Windows的API,不如使用psutil这个库。这个库是跨平台的,可以提供很多关于进程的信息。它可以在Windows、Linux、Mac OS、BSD和Sun Solaris上运行,并且支持Python 2.4到3.4的32位和64位版本。

特别是它的Process类有一些很有意思的方法:

  • cpu_times: 这个方法可以告诉你进程从开始到现在花费了多少时间在用户和系统上。
  • cpu_percent: 这个方法可以显示自上次调用以来,或者在给定时间段内,CPU的使用百分比。
  • memory_info: 这个方法提供关于RAM和虚拟内存使用情况的信息。注意: 文档明确指出这些信息与taskmgr.exe显示的内容一致,所以看起来正是你想要的。
  • memory_info_ex: 这个方法提供更详细的内存信息。
  • memory_percent: 这个方法可以告诉你进程使用的内存百分比。

如果你想查看所有进程(比如找出哪些进程最耗CPU或内存),你可以简单地使用process_iter来遍历它们。


下面是一个简单的实现,展示了你想要达到的效果:

import psutil

def most_intensive_process():
    return max(psutil.process_iter(), key=lambda x: x.cpu_percent(0))

def most_RAM_usage():
    return max(psutil.process_iter(), key=lambda x: x.memory_info()[0])

x = most_intensive_process()
y = most_RAM_usage()

print(x.name)
print(y.name)

在我的系统上的示例运行:

In [23]: def most_intensive_process():
    ...:     # psutil < 2.x has get_something style methods...
    ...:     return max(psutil.process_iter(), key=lambda x: x.get_cpu_percent(0))
    ...: 
    ...: def most_RAM_usage():
    ...:     return max(psutil.process_iter(), key=lambda x: x.get_memory_info()[0])

In [24]: x = most_intensive_process()
    ...: y = most_RAM_usage()
    ...: 

In [25]: print(x.name, y.name)
firefox firefox

撰写回答