读取其他应用程序中ListView中的内容

 

hWindow 为listview的句柄

void
MyGetListViewItem(HWND hWindow)

{

    const nMaxLen=1023;

    char szBuf[nMaxLen+1];

        

    int          nLVItemCount;

    DWORD        dwProcessID;

    HANDLE       hProcess;

    LVITEM       lvItemLocal;

    DWORD        dwBytesRead, dwBytesWrite;

    BOOL         bSuccess,bWriteOK;

        

        

    GetWindowThreadProcessId(hWindow,&dwProcessID);

    hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);

    if(!hProcess)  //得不到指定进程的句柄

        return;

    //在指定进程内分配存储空间

    LPVOID lpTextRemote=VirtualAllocEx(hProcess,NULL,nMaxLen+1,MEM_COMMIT,PAGE_READWRITE);

    LPVOID lpListItemRemote=VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);

    if((!lpTextRemote) || (!lpListItemRemote)) //不能在指定进程内分配存储空间

        return;

        

    nLVItemCount=ListView_GetItemCount(hWindow);

    cout << "ListViewItem总数: " << nLVItemCount << endl;

        

    for(int i=0;i<nLVItemCount;i++)

    {

        ZeroMemory(szBuf,nMaxLen+1);

        bWriteOK= WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,nMaxLen+1,(LPDWORD)&dwBytesWrite);

        if(!bWriteOK) //写内存错误

            return;

        lvItemLocal.iItem=i;

        lvItemLocal.iSubItem=0;

        lvItemLocal.mask=LVIF_TEXT;

        lvItemLocal.cchTextMax=nMaxLen;

        lvItemLocal.pszText=(LPTSTR)lpTextRemote;

        dwBytesWrite=0;

        bWriteOK=WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);

        if(!bWriteOK) //写内存错误

            return;

                  

        SendMessage(hWindow,LVM_GETITEMTEXT,(WPARAM)i,(LPARAM)lpListItemRemote);

        bSuccess=ReadProcessMemory(hProcess,lpTextRemote,szBuf,nMaxLen+1,&dwBytesRead);

        //从指定进程存储空间读取文本

        if(!bSuccess) //不能在指定进程内读取文本

            return;

        cout << i << "=" << szBuf << endl;

    }//end of for(i)

    //在指定进程内释放存储空间

    VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);

    VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);

    //关闭指定进程句柄

    CloseHandle(hProcess);

}

posted on 2005-06-28 13:32  阿彪  阅读(708)  评论(1编辑  收藏  举报

导航