示例詳見:
http://ms.mblogger.cn/supergreenbean/posts/5539.aspx
下载地址:http://60.191.21.235:3322/vbsrc/lvtvgettext.rar 超級綠豆老大示例之"获得其他程序里ListView和TreeView的内容"保存不了ListView內容了,但能保存TreeView的內容.偶n個月前下載是能保存ListView內容的...超級綠豆老大在博客里說他改進了,可以保存listview里所有的内容,難道沒有更新到下載的源程序里-_-#偶是vb超級菜鳥,看不大明白源程序,更不知道問題出在哪裡-_-#超級綠豆老大路過此貼,還請看看是怎麼回事:)有興趣的老大也幫忙看看:)--為了方便各位老大看問題,就貼出保存ListView內容的源碼(希望沒有侵犯超級綠豆老大的源代碼權)--
Function GetLVTextAll(ByVal sFilename As String) As String
    Dim mhwnd As Long
    mhwnd = mlhWnd
    Dim i As Long, s As String
    Dim dwProcessId As Long, hProcess As Long
    Dim dwBytesRead As Long, dwBytesWrite As Long
    Dim bSuccess As Long
    Call GetWindowThreadProcessId(mhwnd, dwProcessId)
    Dim lpListItemRemote As Long, lpTextRemote As Long
    Dim nMaxLen As Long
    nMaxLen = 1023
    Dim szBuf() As Byte
    ReDim szBuf(nMaxLen)
    Dim lvItemLocal As LV_ITEM
    Dim bWriteOK As Long
    Dim lItemIndex As Long    Dim sItemText As String    Dim lSubItemIndex As Long    Dim lFreefile As Long
    Dim lListItemCount As Long, lSubItemCount As Long, k As Long, j As Long
    Dim sOutput As String    lFreefile = FreeFile
    Open sFilename For Output As #lFreefile    lListItemCount = SendMessage(mlhWnd, LVM_GETITEMCOUNT, 0&, ByVal 0&)
    lSubItemCount = GetColumnHeaderCount(mlhWnd) - 1    hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0&, dwProcessId)
    If hProcess <> 0 Then
        lpTextRemote = VirtualAllocEx(ByVal hProcess, ByVal 0&, nMaxLen + 1, MEM_COMMIT, PAGE_READWRITE)
        lpListItemRemote = VirtualAllocEx(ByVal hProcess, ByVal 0&, Len(lvItemLocal), MEM_COMMIT, PAGE_READWRITE)        For k = 0 To lListItemCount - 1
            lItemIndex = k
            For j = 0 To lSubItemCount
                lSubItemIndex = j
                bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpTextRemote, szBuf(0), nMaxLen + 1, dwBytesWrite)
                lvItemLocal.iItem = lItemIndex
                lvItemLocal.iSubItem = lSubItemIndex
                lvItemLocal.mask = LVIF_TEXT
                lvItemLocal.cchTextMax = nMaxLen
                lvItemLocal.pszText = lpTextRemote
                dwBytesWrite = 0
                bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpListItemRemote, ByVal VarPtr(lvItemLocal), Len(lvItemLocal), dwBytesWrite)
                i = SendMessage(mhwnd, LVM_GETITEMTEXT, lItemIndex, ByVal lpListItemRemote)
                bSuccess = ReadProcessMemory(ByVal hProcess, ByVal lpTextRemote, szBuf(0), nMaxLen + 1, dwBytesRead)                '*************** 顯示結果
                i = InStrB(szBuf, ChrB(0))
                If i > 1 Then i = i - 1
                sItemText = StrConv(LeftB(szBuf, i), vbUnicode)
                '*************** 顯示結果
                If j > 0 Then
                    sOutput = sOutput & vbTab & sItemText
                Else
                    sOutput = sItemText
                End If
            Next
            Print #lFreefile, sOutput
        Next        Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, nMaxLen + 1, MEM_DECOMMIT)
        Call VirtualFreeEx(hProcess, ByVal lpTextRemote, Len(lvItemLocal), MEM_DECOMMIT)
        CloseHandle hProcess
    End If    Close #lFreefile
End Function

解决方案 »

  1.   

    //希望路過的老大能解析解析上面的源碼,說說究竟是個怎樣的思路:)简单的说就是用sendmessage发送LVM_GETITEMTEXT消息:
     i = SendMessage(mhwnd, LVM_GETITEMTEXT, lItemIndex,  lvItemLocal)但是由于LVM_GETITEMTEXT并不能跨进程使用,这样就会产生一个问题,因為SendMessage會傳入lvItemLocal的位址 而這個位只是指向呼叫的程序而不是ListView的程序 但ListView並不知道 他還是會乖乖的把變數寫到自己的程序裡面(在Win32中 不同的Process間,同為&H405699位址 是指向不同的地方) 如果這個位只是不能讀寫的 程式就當掉了,所以,我们需要在外部程序中配置記憶體,参考:
    http://sunh.hosp.ncku.edu.tw/~cww/html/q00549.html
      

  2.   

    hoho~~,偶版本太多,不知道上面的是啥了~最有可能出错的地方会在VirtualAllocEx内存分配这里,建议你自己单步跟踪一下此外,偶也想顺便问一下,你用的是什么操作系统?
      

  3.   

    謝謝各位老大的回答~~~~用什麼操作系統也會有影響的嗎?我用的是win2000 5.00.2195 Service Pack 4,瀪體版滴
    這樣的操作系統會有問題嗎?各位老大都試過下面的例子啦?在獲取句柄后,可以保存ListView內容嗎?我怎麼試都不行哦-_-#
    http://ms.mblogger.cn/supergreenbean/posts/5539.aspx
    下载地址:http://60.191.21.235:3322/vbsrc/lvtvgettext.rar