如何用C++获取系统打开程序?

我要用C++ 实现将系统中已打开程序获取出来,并像系统中的任务栏一样,自己用MFC写一个窗口程序,将获取出来的打开程序在自己实现的窗口上以图标显示,点击自己实现的窗口图标会缩小,再次点击就还原,求大神提供思路

http://blog.csdn.net/michealmeng555/article/details/5726942

创建一个 MCF窗口工程,就有这样的界面了。
界面里面添加控件,实现响应函数,调用API很容易获取系统当前已打开程序的信息,

findwindow hook技术或通过管道进程技术。方法很多。

HANDLE handle; //定义CreateToolhelp32Snapshot系统快照句柄

handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统快照句柄   

PROCESSENTRY32 *info;    //定义PROCESSENTRY32结构字指   

//PROCESSENTRY32  结构的 dwSize 成员设置成 sizeof(PROCESSENTRY32)   

info = new PROCESSENTRY32;

info->dwSize = sizeof(PROCESSENTRY32);

//调用一次 Process32First 函数,从快照中获取进程列表   

Process32First(handle, info);
m_List = (CMFCListCtrl*)GetDlgItem(IDC_LIST1);
m_ImageList =  new CImageList();
    m_ImageList->Create(32, 32, ILC_COLOR32, 0, 4); // 必不可少
    m_List->SetImageList(m_ImageList, 0);
int i = 0;
//重复调用 Process32Next,直到函数返回 FALSE 为止   
//获取系统路径
//TCHAR SysPath[MAX_PATH] = {0};
//GetSystemDirectory(SysPath, MAX_PATH);
//CString m_syspath(SysPath);
while (Process32Next(handle, info) != FALSE)
{
    if (info->pcPriClassBase != 8)
        continue;
    HANDLE hRemoteProcess;
    //打开远程线程
    hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, info->th32ProcessID);
    TCHAR szPath[MAX_PATH];
    DWORD nSize = MAX_PATH;
    if (hRemoteProcess == NULL) continue;
    //if (QueryFullProcessImageName(hRemoteProcess, 0, szPath, &nSize))//获取进程目标位置
    if (GetModuleFileNameEx(hRemoteProcess,0, szPath, nSize))
    {
        SHFILEINFO FileInfo;
        DWORD_PTR dwRet = ::SHGetFileInfo(szPath, 0, &FileInfo, sizeof(SHFILEINFO), SHGFI_ICON);//获取图标
        if (dwRet)
        {
            m_List->InsertItem(i, info->szExeFile, m_ImageList->Add(FileInfo.hIcon));
        }
        else
            m_List->InsertItem(i, info->szExeFile, m_ImageList->Add(::LoadIcon(AfxGetApp()->m_hInstance, (LPCTSTR)IDI_ICON1)));

        m_List->SetItemData(i, info->th32ProcessID);
        i++;
    }
    CloseHandle(hRemoteProcess);
}
CloseHandle(handle);
delete info;