在NT下可以用PSAPI来方便的查看系统内的进线程,9X下不知道.

解决方案 »

  1.   

    用psapi中函数比如EnumProcess等,在9X下用FindWindow得到窗口句柄,然后GetWindowThreadProcessId得到ID(不知道对不对)
      

  2.   

    在MSDN中查CreateToolhelp32Snapshot,并查看相关的函数可找到答案,实现起来很简单的。
      

  3.   

    如果只是要其他任一窗口进程可用:GetForegroundWindow,另外的还有很多种方法:如:FindWindow也可,不过只3合适用于有窗口的进程如果是所有的进程则(9X):
    HANDLE hSnap;
    PROCESSENTRY32 PEntry;hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hSnap == 0)
    return; // Pech gehabtPEntry.dwSize = sizeof(PEntry);BOOL ProcID = Process32First(hSnap, &PEntry);CString strProcId;
    while(ProcID != 0) {
    CString strExe = PEntry.szExeFile;
    strProcId.Format ("%u",PEntry.th32ProcessID );
    ProcID = Process32Next(hSnap, &PEntry);
    }
    CloseHandle (hSnap);NT下稍稍麻烦一点,须用到:PSAPI.DLL,VDMDBG.DLL
    HINSTANCE hInstLib ;
    HINSTANCE hInstLib2 ;
    LPDWORD lpdwPIDs ;
    DWORD dwSize, dwSize2, dwIndex ;
    HMODULE hMod ;
    HANDLE hProcess ;
    char szFileName[ MAX_PATH ] ;// PSAPI Function Pointers.
    BOOL (WINAPI *lpfEnumProcesses)( DWORD *, DWORD cb, DWORD * );
    BOOL (WINAPI *lpfEnumProcessModules)( HANDLE, HMODULE *,DWORD, LPDWORD );
    DWORD (WINAPI *lpfGetModuleFileNameEx)( HANDLE, HMODULE,LPTSTR, DWORD );// VDMDBG Function Pointers.
    INT (WINAPI *lpfVDMEnumTaskWOWEx)( DWORD,TASKENUMPROCEX fp, LPARAM );// Load library and get the procedures explicitly. We do
    // this so that we don't have to worry about modules using
    // this code failing to load under Windows 98, because
    // it can't resolve references to the PSAPI.DLL.
    hInstLib = LoadLibraryA( "PSAPI.DLL" ) ;
    if( hInstLib == NULL )
    return;hInstLib2 = LoadLibraryA( "VDMDBG.DLL" ) ;
    if( hInstLib2 == NULL )
    return;// Get procedure addresses.
    lpfEnumProcesses = (BOOL(WINAPI *)(DWORD *,DWORD,DWORD*))GetProcAddress(
    hInstLib, "EnumProcesses" ) ;
    lpfEnumProcessModules = (BOOL(WINAPI *)(HANDLE, HMODULE *,DWORD,
    LPDWORD)) GetProcAddress( hInstLib,"EnumProcessModules" ) ;
    lpfGetModuleFileNameEx =(DWORD (WINAPI *)(HANDLE, HMODULE,LPTSTR, DWORD
    )) GetProcAddress( hInstLib,"GetModuleFileNameExA" ) ;
    lpfVDMEnumTaskWOWEx =(INT(WINAPI *)( DWORD,
    TASKENUMPROCEX,LPARAM))GetProcAddress( hInstLib2, "VDMEnumTaskWOWEx" );if(lpfEnumProcesses == NULL ||
    lpfEnumProcessModules == NULL ||
    lpfGetModuleFileNameEx == NULL ||
    lpfVDMEnumTaskWOWEx == NULL) {
    FreeLibrary( hInstLib ) ;
    FreeLibrary( hInstLib2 ) ;
    return;
    }
    dwSize2 = 256 * sizeof( DWORD ) ;
    lpdwPIDs = NULL ;
    do {
    if( lpdwPIDs ) {
    HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
    dwSize2 *= 2 ;
    }
    lpdwPIDs = (unsigned long *)HeapAlloc( GetProcessHeap(), 0, dwSize2
    );
    if( lpdwPIDs == NULL ) {
    FreeLibrary( hInstLib ) ;
    FreeLibrary( hInstLib2 ) ;
    return;
    }
    if(!lpfEnumProcesses(lpdwPIDs, dwSize2, &dwSize)) {
    HeapFree( GetProcessHeap(), 0, lpdwPIDs ) ;
    FreeLibrary( hInstLib ) ;
    FreeLibrary( hInstLib2 ) ;
    return;
    }
    } while( dwSize == dwSize2 ) ;// How many ProcID's did we get?
    dwSize /= sizeof( DWORD ) ;// Loop through each ProcID.
    for( dwIndex = 2 ; dwIndex < dwSize ; dwIndex++ ) {
    szFileName[0] = 0 ;
    // Open the process (if we can... security does not
    // permit every process in the system).
    hProcess = OpenProcess(
    PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
    FALSE, lpdwPIDs[ dwIndex ] ) ;
    if( hProcess != NULL ) {
    if( lpfEnumProcessModules( hProcess, &hMod,
    sizeof( hMod ), &dwSize2 ) ) {
    // Get Full pathname:
    if( lpfGetModuleFileNameEx( hProcess, hMod,
    szFileName, sizeof( szFileName ) ) ) {
    CString strFileName = szFileName;
    strFileName.MakeUpper ();
    CString strProcId;
    DWORD pid = (DWORD)lpdwPIDs[dwIndex];
    pid.Format ("%u",a);
    }
    }
    CloseHandle( hProcess ) ;
    }