热情软件屋

 

如何监视Windows下运行了哪些程序


编号:QA000291
建立日期: 1999年1月1日 最后修改日期:2002年3月2日
所属类别:

zhorichg:
    哪个API函数能监视Windows下运行了哪些程序?或者, 若编程实现应如何实现?(vb5.0)
    

回答:

    如果你想监测你的查询运行之后又启动了哪些程序,可以使用SetWindowsHookEx (WH_SHELL)来建立一个钩子函数,不过这不太适合VB来做,最好使用C++或Delphi来做(例子可以参考叫RUPL的使用软件:ftp://ftp.zdnet.com/pcmag/1997/0121/rupl.zip,包括VC++源程序。)。如果想知道当前Windows下正在运行的程序可以使用EnumThreadWindows或GetWindows(参见QA001065 "如何用GetWindow函数来列举桌面上的窗口")。
    
    追梦人的意见:
    不管用VB,VC,DELPHI等,其实WINDOWS有关进程API 函数;都可以调用;不过首先得使用TLHELP32 来获得所有进程的句柄.然后进行相关操作。
    
    海波的意见:
    这是从我的一个软件中提出的部分代码,是一个C++类:
    // ProcessInfor.h: interface for the CProcessInfor class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #if !defined(AFX_PROCESSINFOR_H__6AD843E3_A13E_11D5_8C79_909FCCDC071C__INCLUDED_)
    #define AFX_PROCESSINFOR_H__6AD843E3_A13E_11D5_8C79_909FCCDC071C__INCLUDED_
    
    #if _MSC_VER >= 1000
    #pragma once
    #endif // _MSC_VER >= 1000
    
    #define PROCESS_MAX_NUMBER 2048
    
    class CProcessInfor : public CObject
    {
    public:
     CProcessInfor();
     virtual ~CProcessInfor();
    
     int m_ProcessNumbers; //进程数目
    
    public:
     int GetProcessInformat();
     int Refresh();
     BOOL GetProcessAInfor(int nID , PROCESSENTRY32 *pProcessInfor);
    
    
    };
    
    #endif // !defined(AFX_PROCESSINFOR_H__6AD843E3_A13E_11D5_8C79_909FCCDC071C__INCLUDED_)
    
    // ProcessInfor.cpp: implementation of the CProcessInfor class.
    //
    //////////////////////////////////////////////////////////////////////
    
    #include "stdafx.h"
    #include "TestTime.h"
    #include "ProcessInfor.h"
    
    #ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif
    static PROCESSENTRY32 m_processInfor[PROCESS_MAX_NUMBER];
    
    //////////////////////////////////////////////////////////////////////
    //
    //typedef struct tagPROCESSENTRY32
    //{
    // DWORD dwSize;
    // DWORD cntUsage; 进程引用记数
    // DWORD th32ProcessID; 进程标识符
    // DWORD th32DefaultHeapID; 默认堆标识符
    // DWORD th32ModuleID; 模块标识符
    // DWORD cntThreads; 线程引用记数
    // DWORD th32ParentProcessID; 父进程标识符
    // LONG pcPriClassBase; 进程创建的线程的基础优先级
    // DWORD dwFlags; 保留
    // char szExeFile[MAX_PATH]; 进程文件的路径
    //} PROCESSENTRY32;
    //////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////
    
    CProcessInfor::CProcessInfor()
    {
     int i;
    
     for(i=0;i     {
     memset(m_processInfor,0x00,sizeof(PROCESSENTRY32));
     };
    
     m_ProcessNumbers=0;
    
     return;
    }
    
    CProcessInfor::~CProcessInfor()
    {
    
    }
    //////////////////////////////////////////////////////////////////////
    //获取一个进程的数据
    //
    //参数:int nID=索引号
    // PROCESSINFOR * pProcessInfor=存放数据的PROCESSINFOR指针
    //
    //返回:
    // TRUE =成功
    // FALSE=所需的数据不存在
    BOOL CProcessInfor::GetProcessAInfor(int nID, PROCESSENTRY32 * pProcessInfor)
    {
     if(m_ProcessNumbers==0 || nID<0 || nID>PROCESS_MAX_NUMBER)
     {
     return FALSE;
     };
    
     memcpy(pProcessInfor,&m_processInfor[nID],sizeof(PROCESSENTRY32));
    
     return TRUE;
    }
    
    //////////////////////////////////////////////////////////////////////
    //获取进程信息数据
    //
    //
    //返回:当前进程的数目
    //
    int CProcessInfor::GetProcessInformat()
    {
     BOOL bStatu;
     int nCount=0;
     //int nError;
     HANDLE hSnapshot;
     PROCESSENTRY32 peInfor32;
    
     hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
     if(hSnapshot==NULL)
     {
     return 0;
     };
    
     nCount=0;
     peInfor32.dwSize=sizeof(PROCESSENTRY32);
     bStatu=Process32First(hSnapshot,&peInfor32);
     memcpy(&m_processInfor[nCount],&peInfor32,sizeof(PROCESSENTRY32));
    
     while(bStatu)
     {
     nCount++;
     if(nCount>PROCESS_MAX_NUMBER)
     {
     break;
     };
    
     m_processInfor[nCount].dwSize=sizeof(PROCESSENTRY32);
     bStatu=Process32Next(hSnapshot,&peInfor32);
     memcpy(&m_processInfor[nCount],&peInfor32,sizeof(PROCESSENTRY32));
    
     /*
     if(!bStatu)
     {
     nError=GetLastError();
     break;
     };
     */
     };
    
     m_ProcessNumbers=nCount;
    
     return nCount;
    }
    //////////////////////////////////////////////////////////////////////
    //
    int CProcessInfor::Refresh()
    {
     int i;
    
     for(i=0;i     {
     memset(m_processInfor,0x00,sizeof(PROCESSENTRY32));
     };
    
     m_ProcessNumbers=0;
    
     return GetProcessInformat();
    }

此问题由李海回答。

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio