EnumProcess 实现枚举进程

Posted priarienew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EnumProcess 实现枚举进程相关的知识,希望对你有一定的参考价值。

BOOL WINAPI  EnumProcesses (
                             _Out_writes_bytes_(cb) DWORD * lpidProcess,
                             _In_ DWORD cb,
                             _Out_ LPDWORD lpcbNeeded
                            );

HANDLE OpenProcess(  
                    DWORD dwDesiredAccess,  // access flag
                    BOOL bInheritHandle,    // handle inheritance option
                    DWORD dwProcessId       // process identifier
                   );


BOOL WINAPI QueryFullProcessImageNameA(
    _In_ HANDLE hProcess,
    _In_ DWORD dwFlags,
    _Out_writes_to_(*lpdwSize, *lpdwSize) LPSTR lpExeName,
    _Inout_ PDWORD lpdwSize
    );

函数使用起来都比较方便,参数不说了,需要注意使用EnumProcess要包涵#include <Psapi.h>,以及对应的导入库lib
具体代码示例如下:

#include "stdafx.h"
#include <Windows.h>
#include <string>
#include <Psapi.h>

#pragma comment (lib, "Psapi.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	DWORD dwProcessID[0x500] = { 0 };  //开始的预先分配较大的缓冲区,用来存放进程ID
	DWORD dwNeeded = 0;
	BOOL bEnumRes = EnumProcesses(dwProcessID, sizeof(dwProcessID), &dwNeeded);
	UINT uCount = dwNeeded / sizeof(DWORD);//获得枚举到进程的数量
	for (UINT i = 0; i < uCount; i++)
	{ 

               //只对进程进程枚举,所以申请QUERY权限,具体还得根据应用申请权限

		HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, dwProcessID[i]);
		if (NULL !=hProcess)
		{
			CHAR szProcessName[0x50] = { 0 };
			DWORD dwNameLen = 0x50;
			BOOL bRet = QueryFullProcessImageNameA(hProcess, 0, szProcessName, &dwNameLen);
			if (bRet)
			{
				printf("ID:%4d	processName(%s)
", dwProcessID[i], szProcessName);
			}
		}
	}
	getchar();
	return 0;
}

 

技术分享图片

以上是关于EnumProcess 实现枚举进程的主要内容,如果未能解决你的问题,请参考以下文章

代码片段:Shell脚本实现重复执行和多进程

通过Xlib枚举指定进程下所有窗体

VadRoot枚举进程模块在Windows7下的完整实现

带有红宝石集合/可枚举的酷技巧和富有表现力的片段[关闭]

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

纵谈进程枚举