我用CreateProcess启动一个进程,可以通过:LPPROCESS_INFORMATION 得到PID和被启动进程的HANDLE:
typedef struct _PROCESS_INFORMATION { 
    HANDLE hProcess; 
    HANDLE hThread; 
    DWORD dwProcessId; 
    DWORD dwThreadId; 
} PROCESS_INFORMATION;我想得到该进程的类名,怎么办?有什么简单的方法么?
注:不想用EnumWindows。

解决方案 »

  1.   

    BOOL GetProcess(int nID) 

    CString strName;
    HANDLE hProcessSnap=NULL;
    PROCESSENTRY32 pe32={0};
    hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(hProcessSnap==(HANDLE)-1)
    {
    ::MessageBox(NULL,"查询进程失败!:(","错误提示",MB_OK); 
    return FALSE;
    }
    pe32.dwSize=sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32))
    {
    do
    {
    if(nID==pe32.th32ProcessID) //判断制定进程号
    {
    strName.Format("进程编号%d的进程名为:%s",nID,pe32.szExeFile);
    AfxMessageBox(strName);
    }
    }
    while(Process32Next(hProcessSnap,&pe32));
    }
    else
    {
    ::MessageBox(NULL,"出现意外错误!","错误提示",MB_OK);
    return FALSE;
    }
      

  2.   

    to wlwlxj: 你给的不是我要的。我要得到 类 名。ClassName。用GetClassName,则必须传入一个窗口的HWND。可我现在只有PID和HANDLE。
      

  3.   

    查了一些资料,没有找办法。都是根据hwnd句柄获得类名。
      

  4.   

    typedef struct EnumWindows_Struct
    {
    DWORD dwProcID;
    HWND hWnd;
    }EWS,*LPEWS;//枚举窗口,用于查找指定进程ID的主窗口。
    BOOL CALLBACK EnumWindowsProc( HWND hwnd,LPARAM lParam )
    {
    LPEWS pTemp = reinterpret_cast<LPEWS>( lParam );
    DWORD dwProcID;
    GetWindowThreadProcessId( hwnd,&dwProcID );
    if( dwProcID == pTemp->dwProcID )
    {
    TCHAR szClassName[256];
    GetClassName( hwnd,szClassName,250 );
    if( _tcscmp( szClassName,TEXT( "#32770" )) == 0 )
    {
    pTemp->hWnd = hwnd;
    return FALSE;
    }
    } return TRUE;
    }//查找指定进程ID的主窗口。
    HWND CServerMonitorDlg::GetMainWnd( DWORD dwProcID )
    {
    EWS ews;
    ews.dwProcID = dwProcID;
    ews.hWnd = NULL;
    EnumWindows(( WNDENUMPROC )EnumWindowsProc,( LPARAM )&ews ); return ews.hWnd;
    }