获取任务栏所有正在运行程序
mfc程序添加 CListCtrl名称 m_userlist
OnInitDialog 事件中添加INITTHIS 方法
BOOL CALLBACK EnumTaskbarWnds( HWND hwnd, LPARAM lParam )
{
char szClass[256];
list<char*> trasList;
if( !::GetWindow( hwnd, GW_OWNER ) && ::IsWindowVisible( hwnd ) ) // 滤掉不在任务栏显示的窗口
{
GetClassName( hwnd, szClass, 256 );
if( strcmp( szClass, "Shell_TrayWnd" ) != 0 // 滤掉任务栏本身
&& strcmp( szClass, "Progman" ) != 0 ) // 滤掉桌面
{
char szTitle[256];
::GetWindowText( hwnd, szTitle, 256 );
if(strcmp(szTitle,"")==0){
return TRUE;
}
int row=currentObj->m_userlist.InsertItem(currentObj->m_userlist.GetItemCount(),"");
currentObj->m_userlist.SetItemText(row,0,szTitle);
currentObj->m_userlist.SetItemText(row,1,"正在运行");
//这里获取到窗口的进程id
HWND hwnd=FindWindow(szClass,NULL);
HINSTANCE hIns = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
//HICON icon=LoadIcon(handle,0);
DWORD dwProcId=0;
::GetWindowThreadProcessId(hwnd,&dwProcId);
HANDLE pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, dwProcId);
char szExePath[MAX_PATH]="";
GetModuleFileNameEx(pHandle, 0, szExePath, sizeof(szExePath));
WORD rtnIndex;
HICON rtnIcon;
//HICON rtnIcon=ExtractAssociatedIcon(hIns,szExePath,&rtnIndex);//一种导出方式
SHFILEINFO fileInfo;
DWORD dwRet = ::SHGetFileInfo(szExePath, 0, &fileInfo, sizeof(SHFILEINFO), SHGFI_ICON); //另外一种导出方式
rtnIcon=fileInfo.hIcon;
currentObj->m_ImageList.Add(rtnIcon);
LV_ITEM lvitem = {0};
lvitem.mask = LVIF_IMAGE;
lvitem.iItem = row; //设置的第几行
lvitem.iSubItem = 0; //这个表示当前行的列索引
lvitem.iImage = row; //图像索引,以ImageList添加顺序为准
currentObj->m_userlist.SetItem(&lvitem);
}//end if
}//end if
return TRUE;
}
void ctrl_usertaslist::INITTHIS(){
m_userlist.DeleteAllItems();
LONG styles;
styles=GetWindowLong(m_userlist.m_hWnd,GWL_STYLE);
SetWindowLong(m_userlist.m_hWnd,GWL_STYLE,styles | LVS_REPORT);
m_userlist.ShowScrollBar(SB_HORZ,FALSE);
m_userlist.ShowScrollBar(SB_VERT,TRUE);
m_userlist.SetExtendedStyle(LVS_REPORT|LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES|LVS_EX_HEADERDRAGDROP|
LVS_EX_SUBITEMIMAGES);//|LVS_SHOWSELALWAYS
m_userlist.InsertColumn(0,_T("任务"),LVCFMT_LEFT,220,100);
m_userlist.InsertColumn(1,_T("状态"),LVCFMT_CENTER,100,100);
/************************************************************************/
/* cx ,cy:图片的实际像素宽与高
nFlags: 创建图像列表的类型,包括4/8/16/24/32/位色,
nInitial : 创建ImageList初始包括的图像个数
nGrow 当初始分配的图像个数不够的时候,新增一个图片时,指定图象列表能增加的新图象个数,图像列表空间不够而继续添加image时,将按照nGrow继续分配空间,设计时根据具体情况设置合适的值,避免内存频繁的改变图像列表而過度頻繁而使系統记忆体碎片化
----------------------------------------------
例如 nInitial = 2,nGrow=3
当你 添加了两个图像元素以后,还想添加第三个的时候,初始创建分配的nInitial已经使用完了,
此时,系统会根据nGrow,为自动增大Imagelist3个元素容量,此时我们的Imagelist就可以容纳5个图像元素了,
如果5个使用完毕后,会继续按照nGrow进行再分配,类似于一个可变数组,但参数到底设置多少,
还是要根据实际的情况设置合理的值,一要避免浪费空间,又要避免频繁的对Image容器进行resize操作 */
/************************************************************************/
m_ImageList.Create(16, 16, ILC_COLOR16 | ILC_MASK, 5, 2);
m_userlist.SetImageList(&m_ImageList,LVSIL_SMALL);
::EnumWindows(EnumTaskbarWnds, NULL);
}