关于进程模块遍历重复问题
近期学习进程相关知识,我是用diaDlg模仿lordPE这个软件的开始界面,遍历进程的,但是在进程遍历模块的时候发现,我点一下进程pid,模块会给我重复打印,我已经初始化了模块的list,但是他依然给我重复打印,想问一下,我代码应该怎样修改,求教。进程模块遍历代码如下:这段代码是指定某个进程pid,然后根据进程pid遍历相关模块的,目的是我点feige这个进程,模块列表只给我显示feige的模块,然后我点notepad的进程,只给我显示notepad的模块
void modulesview(HWND hwndDlg)
{
LV_COLUMN lv;
HWND hlistmodules;
//初始化
memset(&lv,0,sizeof(LV_COLUMN));
//获取IDC_LIST_PROCESS 句柄
hlistmodules=GetDlgItem(hwndDlg,IDC_LIST_MOUDLE);
//设置整行选中
SendMessage(hlistmodules,LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSELECT,LVS_EX_FULLROWSELECT);
//第一列
lv.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
lv.pszText = TEXT("模块名称"); //列标题
lv.cx = 200; //列宽
lv.iSubItem = 0;
//ListView_InsertColumn(hListProcess, 0, &lv);
SendMessage(hlistmodules,LVM_INSERTCOLUMN,0,(DWORD)&lv);
//第二列
lv.pszText = TEXT("模块位置");
lv.cx = 300;
lv.iSubItem = 1;
//ListView_InsertColumn(hListProcess, 1, &lv);
SendMessage(hlistmodules,LVM_INSERTCOLUMN,1,(DWORD)&lv);}
void enummodules(HWND hlistprocess,HWND hlistmodules,WPARAM wParam,LPARAM lParam)
{
DWORD dwrowid;
TCHAR szpid;
DWORD pid=0;
LV_ITEM lv;
//初始化
memset(&lv, 0, sizeof(LV_ITEM));
lv.mask = LVIF_TEXT; // 指定我们需要的是文本
lv.iSubItem = 1; // 获取的列
lv.pszText = szpid; // 指定储存结果的缓冲区
lv.cchTextMax = sizeof(szpid)/sizeof(szpid); // 指定缓存区大小
// 获取选择行
dwrowid = SendMessage(hlistprocess, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
if (dwrowid == -1)
{
MessageBox(NULL, TEXT("请选择进程"), TEXT("出错了"), MB_OK);
return;
}
// 获取PID
SendMessage(hlistprocess, LVM_GETITEMTEXT, dwrowid, (LPARAM)&lv);
// 解析PID
sscanf(szpid, "%x", &pid);
HANDLE moudle = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
MODULEENTRY32 mi;
mi.dwSize = sizeof(MODULEENTRY32); // 初始化
TCHAR buffer;
memset(buffer,0,0x20);
//初始化
LV_ITEM lvitem;
memset(&lvitem, 0, sizeof(LV_ITEM));
lvitem.mask = LVIF_TEXT;
lvitem.iItem = ListView_GetItemCount(hlistmodules);
BOOL num=Module32First(moudle, &mi);
sprintf(buffer,"%s",mi.szModule);
// 添加模块名到列表
lvitem.pszText = TEXT(buffer);
lvitem.iItem=0;
lvitem.iSubItem = 0;
ListView_InsertItem(hlistmodules, &lvitem);
sprintf(buffer,"%s",mi.szExePath);
// 添加模块路径到列表
lvitem.pszText =TEXT(buffer);
lvitem.iItem=0;
lvitem.iSubItem = 1;
ListView_SetItem(hlistmodules, &lvitem);
CloseHandle(moudle);
}
相关效果图如下:
昨天搞了一下午,实在不知道怎么处理了,向大神求教 你这应该是list控件没清空,你在点击时,清空list,再往里写,在响应时加一条
ListView_DeleteAllItems(hlistmodules); 然后再写就行了 gchq2005 发表于 2024-4-14 13:33
你这应该是list控件没清空,你在点击时,清空list,再往里写,在响应时加一条
ListView_DeleteAllItems(hl ...
嗯嗯,真的谢谢你
页:
[1]