VC++ 对进程各种操作函数

//获取进程路径
CString GetProcessPath( DWORD idProcess )
{
    // 获取进程路径
    CString sPath;
    // 打开进程句柄
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, idProcess );
    if( NULL != hProcess )
    {
        HMODULE hMod;
        DWORD cbNeeded;
        // 获取路径
        if( EnumProcessModules( hProcess, &hMod, sizeof( hMod ), &cbNeeded ) )
        {
            DWORD dw = GetModuleFileNameEx( hProcess, hMod, sPath.
                GetBuffer( MAX_PATH ), MAX_PATH );
            sPath.ReleaseBuffer();
        }
        CloseHandle( hProcess );
    }
    return( sPath );
}

//获取进程优先级
CString GetProcessPriority(HANDLE hProcess)
{
    char sz1[10] = "NORMAL";
    char sz2[10] = "IDLE";
    char sz3[10] = "REALTIME";
    char sz4[10] = "HIGH";
    char sz5[10] = "NULL";
    char sz6[15] = "ABOVENORMAL";
    char sz7[15] = "BELOWNORMAL";
  
    //进程优先级返回
    if(GetPriorityClass(hProcess) == NORMAL_PRIORITY_CLASS)
        return sz1;
    if(GetPriorityClass(hProcess) == IDLE_PRIORITY_CLASS)
        return sz2;
    if(GetPriorityClass(hProcess) == REALTIME_PRIORITY_CLASS)
        return sz3;
    if(GetPriorityClass(hProcess) == HIGH_PRIORITY_CLASS)
        return sz4;
    if(GetPriorityClass(hProcess) == ABOVE_NORMAL_PRIORITY_CLASS)
        return sz6;
    if(GetPriorityClass(hProcess) == BELOW_NORMAL_PRIORITY_CLASS)
        return sz7;
    else
        return sz5;
}

//终止进程主函数
void TerminateProcessID(DWORD dwID)
{
    HANDLE hProcess = NULL;
    //打开进程句柄
    hProcess = OpenProcess(PROCESS_TERMINATE,FALSE,dwID);
    if(hProcess != NULL)
    {
        //终止进程
        TerminateProcess(hProcess,0);
        ::CloseHandle(hProcess);
    }
}

//获取进程快照
void GetProcessInfo()
{
    SHFILEINFO shSmall;
    int nIndex;
    CString str;
    //声明进程信息变量
    PROCESSENTRY32 ProcessInfo;
    //获取系统中的所有进程信息
    HANDLE SnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(SnapShot != NULL)
    {
        m_ListCtrl.DeleteAllItems();
        //设置ProcessInfo的大小
        ProcessInfo.dwSize = sizeof(PROCESSENTRY32);
        //返回系统中第一个进程的信息
        BOOL Status = Process32First(SnapShot,&ProcessInfo);
        //进程计数
        int m_nProcess = 0;
        while(Status)
        {
            m_nProcess++;
            ZeroMemory(&shSmall,sizeof(shSmall));
            //获取进程文件的信息
            SHGetFileInfo(ProcessInfo.szExeFile,0,&shSmall,
                sizeof(shSmall),SHGFI_ICON|SHGFI_SMALLICON);
            //在列表控件中添加映像名称
            nIndex = m_ListCtrl.InsertItem(m_nProcess,ProcessInfo.szExeFile);
            //在列表控件中添加进程PID
            str.Format("%08X",ProcessInfo.th32ProcessID);
            m_ListCtrl.SetItemText(nIndex,1,str);
            //在列表控件中添加进程的父进程PID
            str.Format("%08X",ProcessInfo.th32ParentProcessID);
            m_ListCtrl.SetItemText(nIndex,2,str);
            //获取进程路径
            str = GetProcessPath(ProcessInfo.th32ProcessID);
            m_ListCtrl.SetItemText(nIndex,3,str);
            //获取下一个进程信息
            Status = Process32Next(SnapShot,&ProcessInfo);
        }
    }
    else
        MessageBox("获取进程信息失败!");
}

//获取模块快照
void GetProcessModule(DWORD dwID)
{
    MODULEENTRY32 me32;
    int nIndex;
    CString str;
  
    // 在使用这个结构之前,先设置它的大小
    me32.dwSize = sizeof(me32);
  
    // 给进程内所有模块拍一个快照
    HANDLE hModuleSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwID);
    if(hModuleSnap == INVALID_HANDLE_VALUE)
    {
        //建立快照失败
        MessageBox("获取模块信息失败!", "提示", MB_OK|MB_ICONWARNING);
        return;
    }
  
    // 遍历模块快照,轮流显示每个模块的信息
    BOOL bMore = Module32First(hModuleSnap, &me32);
    int m_nModule = 0;
    while(bMore)
    {
        m_nModule++;
        nIndex = m_listmod.InsertItem(m_nModule, me32.szExePath);//模块路径
        str.Format("%u", me32.modBaseSize);//模块大小
        m_listmod.SetItemText(nIndex,1,str);
        bMore = Module32Next(hModuleSnap, &me32);
    }
    // 不要忘记清除掉snapshot对象
    CloseHandle(hModuleSnap);
}

//
// FindProcess
// 这个函数唯一的参数是你指定的进程名,如:你的目标进程
// 是 "Notepad.exe",返回值是该进程的ID,失败返回0
//

DWORD FindProcess(char *strProcessName)
{
    DWORD aProcesses[1024], cbNeeded, cbMNeeded;
    HMODULE hMods[1024];
    HANDLE hProcess;
    char szProcessName[MAX_PATH];
  
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) return 0;
    for(int i=0; i< (int) (cbNeeded / sizeof(DWORD)); i++)
    {
        //_tprintf(_T("%d "), aProcesses[i]);
        hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
            FALSE, aProcesses[i]);
        EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbMNeeded);
        GetModuleFileNameEx( hProcess, hMods[0], szProcessName,sizeof(szProcessName));
      
        if(strstr(szProcessName, strProcessName))
        {
            //_tprintf(_T("%s;"), szProcessName);
            return(aProcesses[i]);
        }
        //_tprintf(_T(" "));
    }
    return 0;
}

//
// KillProcess
// 此函数中用上面的 FindProcess 函数获得你的目标进程的ID
// 用WIN API OpenPorcess 获得此进程的句柄,再以TerminateProcess
// 强制结束这个进程
//

VOID KillProcess()
{
    // When the all operation fail this function terminate the "winlogon" Process for force exit the system.
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE,
        FindProcess("YourTargetProcess.exe"));
  
    if(hYourTargetProcess == NULL)
    {
        return;
    }
  
    TerminateProcess(hProcess, 0);
    CloseHandle(hProcess);
  
    return;
}

VC获得进程ID获得主线程ID获得窗口句柄获得主窗口获得进程名 1.窗口类名 窗口句柄 窗口标题 窗口句柄 HWND FindWindow( LPCTSTR lpClassName, //窗口类名 可用 VC或者VS自带的Spy++查看 LPCTSTR lpWindowName //窗口标题 ); 举例: 以 记事本为例, 记事本 窗口类名 为:NotePad, 窗口标题 视按具体情况而定,假设为"新建 文本文档.txt - 记事本" 窗口类名 窗口句柄 TCHAR lpClassName[]=TEXT("NotePad"); HWND hWnd=::FindWindow(lpClassName,NULL); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 窗口标题 窗口句柄 TCHAR lpWindowName[]=TEXT("新建 文本文档.txt - 记事本"); HWND hWnd=::FindWindow(NULL,lpWindowName); if(hWnd && IsWindow(hWnd)) ::ShowWindow(hWnd,SW_HIDE); 2.窗口句柄 进程ID 窗口句柄 主线程ID 要使用到的函数: DWORD GetWindowThreadProcessId( HWND hWnd, //目标窗口句柄 LPDWORD lpdwProcessId //返回目标窗口对应进程ID ); 例子: DWORD dwProcId=0;//存放返回的进程ID DWORD dwThreadId=0;//存放返回的主线程ID HWND hWnd=XXXX;//这里省略,可能用任务方式得到一个窗口的句柄.比如用1中的方法. dwThreadId=GetWindowThreadProcessId(hWnd,&dwProcId);//同时得到进程ID和主线程ID. 3.窗口HAND CWnd 用CWnd::FromHandle(HWND hWnd)函数.很多类都有这个函数. 4.进程进程ID (注:进程名,即在"任务管理器"中看到的名字) 用CCheckObject类(详细实现源文件); 例子: 以记事本为例,进程名为 NOTEPAD.EXE (不一定是大写哦,得到任务管理器是显示而定); CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwProcId=ch.GetProcessId(Name); 5. 进程名 主线程ID 例子: CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); DWORD dwThreadId=ch.GetThreadId(Name); 6. 进程名 主窗口句柄 CCheckObject ch; TCHAR Name[]=TEXT("NOTEPAD.EXE"); HWND hWnd=ch.GetTargetWindowHanle(Name); 7. 其它说明 从CCheckObject类和上面的源码中,不难写出从 进程ID 主线程ID 进程ID 主窗口句柄 主线程ID--->主窗口句柄 等等其它类似转换. 对于主窗口,特点如下: A. 不能用进程ID,要用线程ID,因为一个进程可能有多个线程,每个线程都可能会有主窗口. B. 主窗口不会有WS_CHILD属性 C. 主窗口没有父窗口 D. 主窗口一般都有子窗口(这个不是一定的,但是具有普遍性)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值