如何读取一正在运行的程序上的label及相对应的文本内容....
据说使用hook,,,那位大家介绍一下具体用法...谢谢

解决方案 »

  1.   

    可以先得到窗口吧,然后取窗口上的Item吧..
      

  2.   

    获取label的句柄, 直接GetWindowText获取
      

  3.   

    也就是其他进程中的代码嘛char szBuf[2048] = "";    
        int  nLVItemCount;    
        HANDLE hProcess;
        LVITEM lvItemLocal;
        DWORD dwBytesRead, dwBytesWrite;
        BOOL  bSuccess,bWriteOK;
        DWORD dwError;
        hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessID);
        if(NULL == hProcess)
        {
            printf("打开进程失败!\n");
        }
        
        LPVOID lpTextRemote = VirtualAllocEx(hProcess,NULL,2048,MEM_COMMIT,PAGE_READWRITE);
        LPVOID lpListItemRemote = VirtualAllocEx(hProcess,NULL,sizeof(LVITEM),MEM_COMMIT,PAGE_READWRITE);
        
        if((!lpTextRemote) || (!lpListItemRemote)) 
        {
            printf("不能在指定进程内分配存储空间!\n");
        }
        //查询虚拟内存的保护属性
        MEMORY_BASIC_INFORMATION MemInfo;
        DWORD  dwOldProtect;
        MemInfo.RegionSize = sizeof(MEMORY_BASIC_INFORMATION);
        VirtualQueryEx(hProcess,lpTextRemote,&MemInfo,sizeof(MemInfo));
        if(MemInfo.State != MEM_COMMIT)
        {
            printf("分配状态失败!\n");
        }
        if(MemInfo.Protect & (PAGE_NOACCESS|PAGE_GUARD|PAGE_READONLY)) 
        {
            if(VirtualProtectEx(hProcess,(void*)lpTextRemote,4,PAGE_READWRITE,&dwOldProtect) == FALSE) 
            {
                printf("修改内存页属性失败!\n");
                dwError = GetLastError();
                printf("%d\n",dwError);
            }
        }
        nLVItemCount=ListView_GetItemCount(hwnd);// 获取ListView行数 
        for(int i=0;i < nLVItemCount;++i)        
        {
            ZeroMemory(szBuf,2048);    
            bWriteOK = WriteProcessMemory(hProcess,lpTextRemote,(LPVOID)szBuf,2048,(LPDWORD)&dwBytesWrite);
            dwError = GetLastError();
            printf("%d\n",dwError);
            if(!bWriteOK) 
            {
                printf("写内存错误\n");
            }
            for(int j=0;j<5;++j)
            {
                lvItemLocal.iItem = j;    //获取第j列的数据
                lvItemLocal.iSubItem = 0;
                lvItemLocal.mask = LVIF_TEXT;
                lvItemLocal.cchTextMax = 2047;    
                lvItemLocal.pszText = (LPTSTR)lpTextRemote;
                dwBytesWrite = 0;
                //将LVITEM结构写入进程
                bWriteOK = WriteProcessMemory(hProcess,lpListItemRemote,(LPVOID)&lvItemLocal,sizeof(LVITEM),(LPDWORD)&dwBytesWrite);
                dwError = GetLastError();
                printf("%d\n",dwError);
                if(!bWriteOK) //写内存错误
                {
                    printf("写内存错误\n");
                }
                SendMessage(hwnd,LVM_GETITEMTEXT,(WPARAM)j,(LPARAM)lpListItemRemote);
                bSuccess = ReadProcessMemory(hProcess,lpTextRemote,szBuf,2048,&dwBytesRead);
                dwError = GetLastError();
                printf("%d\n",dwError);
                //从指定进程存储空间读取文本
                if(!bSuccess) //不能在指定进程内读取文本
                {
                    printf("不能在指定进程内读取文本\n");
                }
                if(szBuf == NULL)
                {
                    printf("获取内容失败!\n");
                }
                MyData = szBuf;
                MessageBox(NULL,szBuf,NULL,MB_OK);
                printf("%s\n",szBuf);
            }
            
        }
        //在指定进程内释放存储空间
        VirtualFreeEx(hProcess,lpListItemRemote,0,MEM_RELEASE);
        VirtualFreeEx(hProcess,lpTextRemote,0,MEM_RELEASE);
        //关闭指定进程句柄
        CloseHandle(hProcess);
    这是获取外部进程的ListView的数据的代码,其它的类似!
      

  4.   

    学习了。搭车问下
    VirtualAlloc
    GlobalAlloc
    有什么区别呢?