示例詳見:
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
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
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
這樣的操作系統會有問題嗎?各位老大都試過下面的例子啦?在獲取句柄后,可以保存ListView內容嗎?我怎麼試都不行哦-_-#
http://ms.mblogger.cn/supergreenbean/posts/5539.aspx
下载地址:http://60.191.21.235:3322/vbsrc/lvtvgettext.rar