就像一些查看进程的工具一样,列表里进程名前带个图标,怎么获得?应该有API吧?80分求助

解决方案 »

  1.   

    1.CreateToolhelp32Snapshot函数可以找到当前进程的快照句柄,它用于枚举当前所有进程
    2.Process32First找到当前第一个运行的进程
    3.Process32Next找到再一个运行进程
    使用以上三个函数需要引入头文件Tlhelp32.h。
    4.OpenProcess打开当前进程以便得到进程句柄
    5.GetModuleFileNameEx得到指定进程句柄的进程路径
    使用上面这个函数需要引入Psapi.lib的链接与Psapi.h头文件。
    6.SHGetSpecialFolderPath得到系统特殊路径,第三个参数引入CSIDL_DESKTOPDIRECTORY来获得桌面路径.
    使用上面这个函数需要引入shlobj.h头文件
    7.SHGetFileInfo得到文件的外壳图标
    使用上面这个函数需要引入shellapi.h头文件代码如下:
    #pragma comment(lib,"Psapi.lib");
    #include "tlhelp32.h"
    #include "psapi.h"
    #include "shlobj.h"
    #include "shellapi.h"BOOL result1;
    TCHAR szFile[1024],szDesktop[1024];
    int i=0;
    HICON hicon;
    SHFILEINFO fi;
    HANDLE handle,hProcess;
    PROCESSENTRY32 proessEntry;
    ZeroMemory(&proessEntry,sizeof(PROCESSENTRY32));SHGetSpecialFolderPath(GetSafeHwnd(),szDesktop,CSIDL_DESKTOPDIRECTORY,FALSE);
    handle=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if(handle==INVALID_HANDLE_VALUE)
    return 0;
    proessEntry.dwSize=sizeof(PROCESSENTRY32);
    result1=::Process32First(handle,&proessEntry);hProcess=OpenProcess (PROCESS_ALL_ACCESS, FALSE, proessEntry.th32ProcessID);  if(::GetModuleFileNameEx(hProcess,NULL,szFile,sizeof(szFile)/sizeof(TCHAR)))
    {
    CString strFile(szFile),strDesk(szDesktop);
    if(strFile.Find(szDesktop)==0)
    {
    SHGetFileInfo(szFile,0,&fi,sizeof(SHFILEINFO),SHGFI_SMALLICON|SHGFI_ICON);
      //把图标添加到列表上}
    }
    CloseHandle(hProcess);
    while(result1)
    {result1=Process32NextW(handle,&proessEntry);
    hProcess=OpenProcess (PROCESS_ALL_ACCESS, FALSE, proessEntry.th32ProcessID);  
    if(::GetModuleFileNameEx(hProcess,NULL,szFile,sizeof(szFile)/sizeof(TCHAR)))
    {
    CString strFile(szFile),strDesk(szDesktop);
    if(strFile.Find(szDesktop)==0)
    {
    SHGetFileInfo(szFile,0,&fi,sizeof(SHFILEINFO),SHGFI_SMALLICON|SHGFI_ICON);//必须同时指定SHGFI_SMALLICON与SHGFI_ICON
    //把图标添加到列表上}
    } CloseHandle(hProcess);
    }