VC跨进程操作SysListview32

bool CTaskManager::StockCodeIsExist(CString stockCode)
{
    HWND hMain = CWndHelper::GetMainWnd();
    HWND hListview = ::FindWindowEx(hMain, NULL, _T("SysListView32"), NULL);
    ASSERT(hListview);


    //listview的列头句柄
    int headerhwnd = ::SendMessage(hListview, LVM_GETHEADER, 0, 0);

    //总行数
    int rows = ::SendMessage(hListview, LVM_GETITEMCOUNT, 0, 0);
    //列表列数
    int cols = ::SendMessage((HWND)headerhwnd, HDM_GETITEMCOUNT, 0, 0);

    DWORD ProcessID = NULL;
    DWORD ThreadID = GetWindowThreadProcessId(hListview, &ProcessID);

    //打开并插入进程
    HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, ProcessID);
    //申请代码的内存区
    LPVOID pointer = (LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);

    bool result = false;
    for (int i = 0; i < rows; i++)
    {
        int j = 0;
        // for (int j = 0; j < cols; j++)
        {
            LVITEM vItem;
            vItem.mask = LVIF_TEXT;    //说明pszText是有效的
            vItem.iItem = i;        //行号
            vItem.iSubItem = j;        //列号
            vItem.cchTextMax = 512;    //所能存储的最大的文本为256字节
            LPWSTR pItem = NULL;
            //申请内存空间
            pItem = (LPWSTR)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE);
            vItem.pszText = pItem;

            WriteProcessMemory(hProcess, pointer, &vItem, sizeof(LVITEM), NULL);
            ::SendMessage(hListview, LVM_GETITEMW, (WPARAM)i, (LPARAM)pointer);
            char ItemBuf[512];
            memset(ItemBuf, 0, 512);
            ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);

            CString strItemText; //i行j列的文本值
            strItemText.Format(_T("%s"), ItemBuf);
            if (strItemText == stockCode)
            {
                //选中行
                vItem.state = LVIS_SELECTED | LVIS_FOCUSED | LVIS_ACTIVATING;
                vItem.stateMask = LVIS_SELECTED;
                WriteProcessMemory(hProcess, pointer, &vItem, sizeof(LVITEM), NULL);
                SendMessage(hListview, LVM_SETITEMSTATE, (WPARAM)i, (LPARAM)pointer);

                result = true;
            }

            //释放内存空间
            VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
        }
    }

    //释放内存空间
    VirtualFreeEx(hProcess, pointer, 0, MEM_RELEASE);//在其它进程中释放申请的虚拟内存空间,MEM_RELEASE方式很彻底,完全回收
    CloseHandle(hProcess);//关闭打开的进程对象
    return result;
}
本文为“老吴笔记”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注