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.   

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

  4.   

    从理论上而言,是有可能得不到新创建的进程的。
    这其实是windows设计中的一个小小遗憾,请参照《undocument windows security》。