从进程 ID 获取进程名称 (win32)
我需要获取 Windows 系统上所有进程的列表,包括名称和 PID。
EnumProcess 可以获得pid列表,但是如何从 pid 中获取进程名称呢?我不想在进程上调用 OpenProcess,因为这并不总是有效(就像其他进程由不同的用户运行一样)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您有不同的选项,您可以使用它来接收当前正在运行的进程的 exe 名称(如您所写的进程名称)。最好的方法在一定程度上取决于您使用的编程语言和其他要求。例如,您可以使用 WMI。另一种更古老的方法是使用性能计数器(另请参阅性能计数器简介)。要获取计数器值,您只需使用
HKEY_PERFORMANCE_DATA
基键中的注册表查询操作即可(请参阅 检索计数器数据)另一种也很好用的方法是 NtQuerySystemInformation 函数,以
SystemProcessInformation
作为参数。EnumProcess
和许多其他 Windows API 在内部使用该函数。 SYSTEM_PROCESS_INFORMATION >NtQuerySystemInformation 有许多“未记录的”但多年来众所周知的字段。如果您在互联网上搜索该结构的定义,您将获得完整的文档。我想知道功能帽子状态没有完整记录。该功能至少在 NT 3.5 中存在(可能之前也有),现在可以在 Windows 7 32 位或 64 位上很好地使用。具体来说,您将在下面找到一个小型 C 测试程序,它打印所有进程 ID 以及相应的 exe 名称(不是完整的 exe 路径,只是文件名):You have different option which you can use to receive exe names of currently running processes (process names like you wrote). The best way depends a little from the programming language which you use and from other requirements. For example you can use WMI. One other more old way is the usage of Performance Counters (see also An Introduction To Performance Counters). To get the counters values you can just use registry query operations from the
HKEY_PERFORMANCE_DATA
base key (see Retrieving Counter Data)One more way which can be also good used is the NtQuerySystemInformation function with
SystemProcessInformation
as a parameter.EnumProcess
and many other Windows API use the function internally. The structSYSTEM_PROCESS_INFORMATION
defined in the documentation of NtQuerySystemInformation has many "undocumented" but since many many years well-known fields. If you search in the Internet for the definition of the structure you will fined full documentation. I wonder that the function hat status not full documented. The function was at least in NT 3.5 (probably also before) and can be good used now on Windows 7 32- or 64-bit. To be exact below you will find a small C test program which print all process ids with the corresponding exe names (not full exe path, just the file name):您可以使用 工具帮助 API。
以下代码将显示每个进程的
pid
和name
。Ýou can get the process identifier and
name
for all running processes using the ToolHelp API.The following code will display the
pid
andname
for each process.CreateToolhelp32Snapshot() 将为您提供进程名称(但不是路径);除此之外,您还必须调用 OpenProcess()。如果您的代码在管理上下文中运行,您可以启用 SE_DEBUG_NAME 权限来访问在其他上下文中运行的进程。
CreateToolhelp32Snapshot() will give you the process name (but not the path); other than that, you will have to call OpenProcess(). If your code is running in an administrative context you could enable the SE_DEBUG_NAME privilege to get access to processes running under other contexts.