while(1){        AfxMessageBox("开始一轮");

        HANDLE hSnapShot = NULL;
BOOL reboot = 1;//重启标志位
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获取当前进程快照

PROCESSENTRY32 prosInfo;//定义PROCESSENTRY32结构
prosInfo.dwSize = sizeof(prosInfo);//设置PROCESSENTRY32结构大小

BOOL bStatus = Process32First(hSnapShot, &prosInfo);//获得第一个进程的句柄

while(bStatus){

CString scTmp = prosInfo.szExeFile;//获得进程全名
scTmp.MakeUpper();//将csTmp字符串转为大写
AfxMessageBox(scTmp);//显示进程名称

bStatus = Process32Next(hSnapShot, &prosInfo);

if(scTmp != "IPMSG.EXE"){

        bStatus = Process32Next(hSnapShot, &prosInfo);//获得下一个进程的句柄

}

}

CloseHandle(hSnapShot);//关闭快照
AfxMessageBox("本轮结束");
}
这是一个简单的进程查看程序,请教各位高手,我的问题是,我运行本程序,在第一轮快结束的时候,我打开另外一个程序(例如飞鸽传书:IPMSG.exe),但是在第二轮,第三轮等等之后我都看不到有IPMSG.exe的显示,这是为什么呢?

解决方案 »

  1.   

    原因是: hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获取当前进程快照
    你已经获取了进程的快照,但是这个时候,你所谓的另外的程序并没有发生。由于快照就是一个”静态“的
    :即保存了当前的进程。它不会发生变化。
      

  2.   

    可是,第二轮的时候,从新执行hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);,快照不就刷新了么?
      

  3.   

    可是,第二轮的时候,从新执行hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);,快照不就刷新了么?
      

  4.   

    CloseHandle(hSnapShot);//关闭快照
    要先关闭!
      

  5.   

    没那么麻烦吧错得很有趣
       while(bStatus){
                
            CString    scTmp    = prosInfo.szExeFile;//获得进程全名
            scTmp.MakeUpper();//将csTmp字符串转为大写
            AfxMessageBox(scTmp);//显示进程名称
                
            bStatus    = Process32Next(hSnapShot, &prosInfo);
                
            if(scTmp == "IPMSG.EXE"){
                    AfxMessageBox(scTmp);//这就够了
                    //bStatus    = Process32Next(hSnapShot, &prosInfo);//这行多余,隔一个判断一个?                
            }            
                
        }