关闭

【转】通过CreateToolhelp32Snapshot函数获得系统中当前运行的进程信息

205人阅读 评论(0) 收藏 举报

通过调用CreateToolhelp32Snapshot函数可以对当前系统中运行的进程取一个快照,获得系统中运行的进程的相关信息,获得进程ID以后就可以通过OpenProcess函数获得进程的句柄,实现对进程的控制具体实现代码如下

#include <windows.h>
#include <tlhelp32.h>
BOOL CALLBACK EnumChildWindowProc(HWND hWnd,LPARAM lParam);//枚举记事本中的子窗口
char mess[2048];
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
    HWND nphWnd=::FindWindow("notepad",NULL);
    if(nphWnd)
    {
        char temp[1024];
        PROCESSENTRY32 pe32;
        pe32.dwSize=sizeof(pe32);
        HANDLE hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得进程列表的快照,第一个参数可以有其他选项,详细请参考MSDN
        if(hProcessSnap==INVALID_HANDLE_VALUE)
        {
            ::MessageBox(NULL,"CreateToolhelp32Snapshot error","error",MB_OK);
            return 0;
        }
        BOOL bMore=::Process32First(hProcessSnap,&pe32);//获得第一个进程的信息        
        while(bMore)
        {
            ::wsprintf(temp,"%s%s%s%d%s","进程名: ",pe32.szExeFile," 进程ID: ",pe32.th32ProcessID,"\r\n");
            ::strcat(mess,temp);
            HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,(DWORD)pe32.th32ProcessID);//根据进程ID获得进程句柄
            if(hProcess==NULL)//如果无法获得进程句柄,则打印出错原因和信息
            {
                DWORD lerror=::GetLastError();
                char errormess[1024];
                ::wsprintf(errormess,"%s%d%s","error code: ",lerror," ");
                ::strcat(errormess,temp);
                ::MessageBox(NULL,errormess,"error",MB_OK);
            }
            bMore=::Process32Next(hProcessSnap,&pe32);//获得其他进程信息
        }
        ::EnumChildWindows(nphWnd,EnumChildWindowProc,0);//获得记事本的edit窗口,打印进程信息
        return 0;
    }
    else
    {
        ::MessageBox(NULL,"please open notepad","error",MB_OK);
        return 0;
    }
}
BOOL CALLBACK EnumChildWindowProc(HWND hWnd,LPARAM lParam)
{
    char temp1[256];
    if(hWnd)
    {
        ::GetClassName(hWnd,temp1,255);
        if(!::strcmp(temp1,"Edit"))//得到edit子窗口句柄
        {
            ::SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)mess);
            return 0;
        }
    }
    return true;
}



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3260次
    • 积分:53
    • 等级:
    • 排名:千里之外
    • 原创:0篇
    • 转载:4篇
    • 译文:1篇
    • 评论:0条
    文章分类
    文章存档