要做一个类似于windows的任务管理器,碰到几个问题:
1.正在运行的进程都枚举出来非常多,但是在应用程序页面的任务只是一些用户程序,选择列出这些用户程序的标准是什么?  比如处在托盘的程序就没有列举出来。 
2.如何通过进程id获取app的title . 
3.如何获取app的程序小图标.
我通过如下的代码段获取图标句柄,为什么失败
HANDLE hSnapshot = INVALID_HANDLE_VALUE;
HICON hSmallIcon;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcId);
if (INVALID_HANDLE_VALUE == hSnapshot)
{

return NULL;
} MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32); if (!Module32First(hSnapshot, &me32))
{
CloseHandle(hSnapshot);
return NULL;
}

return ExtractIconEx(me32.szExePath, 0, NULL, &hSmallIcon, 1);

解决方案 »

  1.   


    http://dev.csdn.net/develop/article/73/73632.shtm
    http://www.tongyi.net/develop/C/1020237.html
      

  2.   

    http://blog.csdn.net/rageliu/archive/2006/06/28/846567.aspx
      

  3.   

    按照http://dev.csdn.net/develop/article/73/73632.shtm 中介绍的
      1.窗口信息
      MS为我们提供了打开特定桌面和枚举桌面窗口的函数。
      hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);
      //打开我们默认的Default桌面;
      EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);
      //枚举打开桌面上的所有窗口,由回调函数实现。
      BOOL __stdcall EnumWindowProc(HWND, LPARAM);
      //在回调函数中,我们可以获得窗口的标题和相关进程,线程信息;
      GetWindowText(hWnd,szWindowText,dwMaxCount);
      GetWindowThreadProcessId(hWnd,&dwPID);我写的代码如下:
    HDESK hDesk= OpenDesktop(L"Winlogon" /*NULL*/, 0, FALSE, DESKTOP_ENUMERATE);
    if (hDesk == NULL)
    {
    DWORD dwError = GetLastError();
    wprintf(L"%d", dwError);
    }
    else 
    {
    EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowsProc, 0);
    CloseDesktop(hDesk);
    }这里的HDESK OpenDesktop(
      LPTSTR lpszDesktop,
      DWORD dwFlags,
      BOOL fInherit,
      ACCESS_MASK dwDesiredAccess)  的第一个参数是什么,看了别人的例子,用"Winlogon"代入,但是执行失败,失败码是2 . 
      

  4.   

    根据Msdn的re :The calling process must have an associated window station, either assigned by the system at process creation time or set by the SetProcessWindowStation function. 代码修改如下;
    /////////////////////////////////////////////
    HWINSTA hwinstaOld;
    HWINSTA hwinstaTemp;hwinstaTemp = OpenWindowStation(L"Winlogon", FALSE, DESKTOP_ENUMERATE);
    if (NULL == hwinstaTemp)
    {
    DWORD dwError = GetLastError();
    wprintf(L"%d", dwError);
    return 1;     
    }hwinstaOld = GetProcessWindowStation();
    SetProcessWindowStation(hwinstaTemp);HDESK hDesk= OpenDesktop(L"Winlogon" /*NULL*/, 0, FALSE, DESKTOP_ENUMERATE);
    if (hDesk == NULL)
    {
    DWORD dwError = GetLastError();
    wprintf(L"%d", dwError);
    }
    else 
    {
    EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowsProc, 0);
    CloseDesktop(hDesk);
    }
    CloseWindowStation(hwinstaTemp);
    SetProcessWindowStation(hwinstaOld);
    ///////////////////////////////////////////仍然搞不清楚OpenWindowStation的第一个参数需要填什么 ,程序debug , OpenWindowStation返回失败.errorcode = 2;
      

  5.   

    http://blog.csdn.net/handsomerun/archive/2006/08/22/1106664.aspx