A学习的小菜鸟 发表于 2024-4-14 10:43

关于进程模块遍历重复问题

近期学习进程相关知识,我是用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);
}
相关效果图如下:

昨天搞了一下午,实在不知道怎么处理了,向大神求教

gchq2005 发表于 2024-4-14 10:43

你这应该是list控件没清空,你在点击时,清空list,再往里写,在响应时加一条
ListView_DeleteAllItems(hlistmodules); 然后再写就行了

A学习的小菜鸟 发表于 2024-4-14 16:03

gchq2005 发表于 2024-4-14 13:33
你这应该是list控件没清空,你在点击时,清空list,再往里写,在响应时加一条
ListView_DeleteAllItems(hl ...

嗯嗯,真的谢谢你
页: [1]
查看完整版本: 关于进程模块遍历重复问题