现在一个程序,想得到另一个程序界面中listbox中的某一行的字符串实验了很多次次没有成功,敢问有做过的给讲解一下,失败方法:   知道listbox句柄直接发消息LB_GETTEXT失败,LB_GETCOUNT,和LB_GETTEXTLEN都可以得到值,   但是就是LB_GETTEXT得不到字符串;敢问做过的朋友是怎么做的?

解决方案 »

  1.   

    需要写入远程进程的,提供一段代码给你,以下是远程获取远程进程clistctrl的每一项的文字的,listbox一样:CWnd *pHack = CWnd::FromHandle(hwnd);
    CListCtrl *listHack = (CListCtrl *)pHack; POSITION pos = listHack->GetFirstSelectedItemPosition();
    int iItem = listHack->GetNextSelectedItem(pos); //房间索引号 if (iItem != oldItem)  //如果房间索引号变了,则重新获取新的房间名,并重新获取新的房间项区域
    {
    oldItem = iItem;   //重置原房间索引 RECT *lpRect;
    LVITEM lvitem, *plvitem;
    char ItemBuf[512],*pItem;
    DWORD PID;
    HANDLE hProcess; GetWindowThreadProcessId(hwnd, &PID);
    hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
    if (!hProcess)
    {
    //获取进程句柄操作失败
    }
    else
    {
    plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE);
    pItem=(char*)VirtualAllocEx(hProcess, NULL, 512, MEM_COMMIT, PAGE_READWRITE); if ((!plvitem)||(!pItem))
    {
    //无法分配内存
    }
    else    //获取房间名
    {
    lvitem.cchTextMax=512;
    lvitem.iSubItem=0; //ProcessName
    lvitem.pszText=pItem;
    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
    ::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem);
    ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
    }
    CloseHandle(hProcess);
    VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
    }
      

  2.   

    主要是这一段:lvitem.cchTextMax=512;
                                    lvitem.iSubItem=0; //ProcessName
                                    lvitem.pszText=pItem;
                                    WriteProcessMemory(hProcess, plvitem, &lvitem, sizeof(LVITEM), NULL);
                                    ::SendMessage(hwnd,LVM_GETITEMTEXT, (WPARAM)iItem,(LPARAM)plvitem);
                                    ReadProcessMemory(hProcess, pItem, ItemBuf, 512, NULL);
      

  3.   


    HWND hWnd = ::FindWindow(NULL, _T("X"));
    if(hWnd)
    {
    HWND hListBox = ::FindWindowEx(hWnd, NULL, _T("ListBox"), NULL);
    if(hListBox)
    {
    LRESULT lRet = ::SendMessage(hListBox, LB_GETCOUNT, 0, 0);
    if(LB_ERR != lRet)
    {
    TCHAR szText[512] = {0};
    for(int i=0; i<lRet; i++)
    {
    ::SendMessage(hListBox, LB_GETTEXT, i, (LPARAM)szText);
    AfxMessageBox(szText);
    }
    }
    }
    }
      

  4.   

    是啊,是非模态对话框,我没有说模态对话框啊,
    extern "C" __declspec (dllexport) void ShowDlg()
    {
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        if (!dlg.m_hWnd) dlg.Create(IDD_DIALOG1);
        dlg.ShowWindow(SW_NORMAL);    MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
      

  5.   

    两个程序间这样发消息,最后一个消息得不到的,这就是我说的失败的原因!
    至少我在CE系统上没有得到!
    我来试试二楼的!
    Tank you  still @
      

  6.   

    不行啊,listbox和listview是不一样的,使用代码不行呀,修改了也有问题WriteProcessMemory两个写后的内存值不一样