我要用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;