我想获取QQ好友和群的列表
从窗口从端口获取都可以 望大家指教(干正事)我现在在一个群聊天窗口挂了一个钩子 能获取一个群成员列表的控件类:syslistview32
获取之后转换listctrl能获取成员人数 但是获取不了其他信息(可能是我对clistctrl了解少吧)算是两个问题吧 希望大家帮忙!~~~

解决方案 »

  1.   

    用SPy++找到QQ窗体,在程序里面查找窗体,得到窗体句柄后再重建临时窗体对象,通过临时对象访问你所需要的信息
      

  2.   

    FindWindow FromHandle CListCtrl GetItem
      

  3.   

    FromHandle 不行
    得.m_hWnd = hwnd
    我是这么写的 但是就是弄不出来
    大家帮我看看有什么问题 还有其他方法么 // 复制对象
    CListView peopleList;
    peopleList.m_hWnd = hwndList;
    CListCtrl& pListCtrl = peopleList.GetListCtrl();
    CListCtrl* showCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_MEMBER); // 复制样式
    //  showCtrl->ModifyStyle(showCtrl->GetStyle(), 50210441);
    //  showCtrl->SetExtendedStyle(4); showCtrl->ModifyStyle(showCtrl->GetStyle(), pListCtrl.GetStyle());
    showCtrl->SetExtendedStyle(pListCtrl.GetExtendedStyle()); // 获取列
    int nColumn = pListCtrl.GetHeaderCtrl()->GetItemCount();
    int i = 0; // 获得图像列表
    m_imageList = pListCtrl.GetImageList(LVSIL_SMALL);
    showCtrl->SetImageList(m_imageList, LVSIL_SMALL); // 设置头
    HDITEM item;
    for (i=0; i<nColumn; i++)
    {
    pListCtrl.GetHeaderCtrl()->GetItem(i, &item);
    showCtrl->GetHeaderCtrl()->SetItem(i, &item);
    } // 复制所有项
    int j = 0;
    int nRow = pListCtrl.GetItemCount();
    LVITEM lvItem;
    for (j=0; j<nRow; j++)
    {
    for (i=0; i<nColumn; i++)
    {
    lvItem.iItem = j;
    lvItem.iSubItem = i;
    pListCtrl.GetItem(&lvItem);
    showCtrl->SetItem(&lvItem);
    }
    }
      

  4.   

    不晓得有没有为第三方提供的interface哦。
      

  5.   

    你可能是跨进程读取。 跨进程读取LISTVIEW文本时,需要在远程进程先用VirtualAllocEx分配一个缓冲区,然后把LVITEM.pszText域设置成该缓冲区指针,然后在获取文本内容
      

  6.   

    up// 复制所有项
        int j = 0;
        int nRow = pListCtrl.GetItemCount();
        LVITEM lvItem;
        for (j=0; j<nRow; j++)
        {
            for (i=0; i<nColumn; i++)
            {
                lvItem.iItem = j;
                lvItem.iSubItem = i;
                pListCtrl.GetItem(&lvItem);
                showCtrl->SetItem(&lvItem);
            }
        }
    不对
      

  7.   

    我没试,说出崩溃在哪里,and your code
      

  8.   

    int    i, nCount = GetItemCount();
    HDITEM hdi;
    enum   { sizeOfBuffer = 1024 };
    TCHAR  lpBuffer[sizeOfBuffer];
    bool   fFound = false; hdi.mask = HDI_TEXT;
    hdi.pszText = lpBuffer;
    hdi.cchTextMax = sizeOfBuffer; int iHeight = 0; for (i=0; (i < nCount); i++)
    {
    GetItem(i, &hdi);
    pDCDst->DrawText(hdi.pszText, -1, &rectCalc, DT_LEFT | DT_CALCRECT | DT_WORDBREAK | DT_NOPREFIX | DT_EDITCONTROL);
    }
      

  9.   

    就是我上面贴的程序把GetItem改为GetItemText就崩溃
    我先看看你的代码
      

  10.   

    好像不行 我把它放到exe或者dll里都不行, 主要是sendmessage发送不过去 总是false
    帮忙看一下: DWORD dwID;
    GetWindowThreadProcessId(hwndList, &dwID);
    if (dwID == 0)
    {
    LPVOID lpMsgBuf;
    FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
    ); 
    MessageBox((LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    return;
    }
    HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
    if (handle == NULL)
    {
    MessageBox(_T("OpenProcess is error"));
    return;
    } LVITEM* newLVProcess = (LVITEM*)VirtualAllocEx(handle, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE );
    char* newLVChar = (char*)VirtualAllocEx(handle, NULL, 5120*sizeof(char), MEM_COMMIT, PAGE_READWRITE );

    if (newLVProcess == NULL || newLVChar == NULL)
    {
    MessageBox(_T("VirtualAllocEx"));
    return;
    }

    LVITEM item;
    item.mask = LVIF_TEXT;
    item.pszText = newLVChar;
    item.cchTextMax = 512;
    item.iSubItem = 1;
    WriteProcessMemory(handle, newLVProcess, &item, sizeof(LVITEM), NULL); int nCount = ListView_GetItemCount(hwndList);
    char szBuffer[512];
    int i = 0;
    for (i=0; i<nCount; i++)
    {
    if (!::SendMessage(hwndList, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)newLVProcess))
    (i<3)?MessageBox("SendMessage is False!"):0;
    if (!ReadProcessMemory(handle, newLVChar, szBuffer, sizeof(szBuffer), NULL))
    (i<3)?MessageBox("ReadProcessMemory is False"):0;
    if (i < 3)
    {
    MessageBox(szBuffer);
    if (szBuffer == NULL)
    MessageBox("szBuffer is NULL!!~~");
    }
    }

    CloseHandle(handle);
    VirtualFreeEx(handle, newLVProcess, 0, MEM_RELEASE);
    VirtualFreeEx(handle, newLVChar, 0, MEM_RELEASE);
      

  11.   


    不对不对
    if (WriteProcessMemory(handle, newLVProcess, &item, sizeof(LVITEM), NULL))
    MessageBox("WriteProcessMemory is False!");
    这里就false了
      

  12.   

    不对 忘记加!了群管理列表搞定了 就剩下QQ好友和群的列表了
    分享一下代码(没加注释 sorry):
    DWORD dwID;
    GetWindowThreadProcessId(hwndList, &dwID);
    if (dwID == 0)
    {
    LPVOID lpMsgBuf;
    FormatMessage( 
    FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    FORMAT_MESSAGE_FROM_SYSTEM | 
    FORMAT_MESSAGE_IGNORE_INSERTS,
    NULL,
    GetLastError(),
    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    (LPTSTR) &lpMsgBuf,
    0,
    NULL 
    ); 
    MessageBox((LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
    return;
    }
    HANDLE handle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
    if (handle == NULL)
    {
    MessageBox(_T("OpenProcess is error"));
    return;
    } LVITEM* newLVProcess = (LVITEM*)VirtualAllocEx(handle, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE );
    char* newLVChar = (char*)VirtualAllocEx(handle, NULL, 512*sizeof(char), MEM_COMMIT, PAGE_READWRITE );

    if (newLVProcess == NULL || newLVChar == NULL)
    {
    MessageBox(_T("VirtualAllocEx"));
    return;
    }

    LVITEM item;
    item.mask = LVIF_TEXT;
    item.pszText = newLVChar;
    item.cchTextMax = 512;
    item.iSubItem = 0; int nCount = ListView_GetItemCount(hwndList);
    char szBuffer[512];
    int i = 0;
    CListCtrl* showCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_MEMBER);
    for (i=0; i<nCount; i++)
    {
      item.iItem = i;
    WriteProcessMemory(handle, newLVProcess, &item, sizeof(LVITEM), NULL);
    ListView_GetItem(hwndList, newLVProcess);
    ReadProcessMemory(handle, newLVChar, szBuffer, 512, NULL);
    if (i < 3)
    {
    MessageBox(szBuffer);
    if (szBuffer == NULL)
    MessageBox("szBuffer is NULL!!~~");
    }
    }

    CloseHandle(handle);
    VirtualFreeEx(handle, newLVProcess, 0, MEM_RELEASE);
    VirtualFreeEx(handle, newLVChar, 0, MEM_RELEASE);
      

  13.   

    Tencent_QQBar 到底是什么类做的
    里面的列表应该是TREE吧 但是他那导航栏用什么做的呢
      

  14.   

    如需要阅读该回复,请登录或注册CSDN!