***[关注]:关于获取ListView中内容的问题

yunok 2004-03-27 02:20:02
有一个软件,它在自己的ListView中列出了很多IP地址。

我希望能够把该软件中ListView的所有内容(值)都取出来,保存成Txt。

请教大侠指点思路或赐赠代码。不胜感激。
...全文
71 点赞 收藏 19
写回复
19 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
yunok 2004-03-29
结贴!感谢兄弟们!!
回复
supergreenbean 2004-03-28
我也写错了。今天真是睡觉睡太多了,老是要给自己打补丁,呵呵……

把其中一个
Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, 0, MEM_DECOMMIT)
改成
Call VirtualFreeEx(hProcess, ByVal lpTextRemote, 0, MEM_DECOMMIT)

回复
rainstormmaster 2004-03-27
不用了,现在知道了,看来头晕的时候是不该写代码:)
回复
rainstormmaster 2004-03-27
to supergreenbean(超级绿豆) :
你的代码和我的代码主要区别在什么地方?现在我没有时间细看了,或者说说我的代码哪里有问题也可
回复
supergreenbean 2004-03-27
模块文件依然参照
http://expert.csdn.net/Expert/topic/2728/2728920.xml?temp=.9317743
里的,然后把里面的窗体代码部分改为下面这样就行了

Option Explicit

Private Sub Command1_Click()
Dim mhwnd As Long
mhwnd = 1705642 '这是我的句柄 ^_^
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

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)
bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpTextRemote, szBuf(0), nMaxLen + 1, dwBytesWrite)

Dim lItemCount As Long, lItemIndex As Long, lSubItemIndex As Long
Dim asItemText() As String
lItemCount = ListView_GetItemCount(mhwnd)
If lItemCount > 0 Then
ReDim asItemText(lItemCount - 1)
End If
lSubItemIndex = 1 '取得第几栏的文本
For lItemIndex = 0 To lItemCount - 1
lvItemLocal.iItem = lItemIndex
lvItemLocal.iSubItem = lSubItemIndex - 1
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)

asItemText(lItemIndex) = StrConv(LeftB(szBuf, InStrB(szBuf, ChrB(0)) - 1), vbUnicode)
Next

Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, 0, MEM_DECOMMIT)
Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, 0, MEM_DECOMMIT)
SaveToFile asItemText()
End If
CloseHandle hProcess

End Sub
Sub SaveToFile(asItemText() As String)
Dim lFreeFile As Long, i As Long
lFreeFile = FreeFile

Open "c:\ip.txt" For Output As #lFreeFile
For i = 0 To UBound(asItemText)
Print #lFreeFile, asItemText(i)
Next
Close #lFreeFile
End Sub
Function ListView_GetItemCount(ByVal hWnd As Long) As Long
ListView_GetItemCount = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, ByVal 0&)
End Function
回复
daisy8675 2004-03-27
回复回复我的吧!我好可怜咯!
////////////////////
不是沒有回復你,是因為實在沒有時間去研究word。
回复
RonoTian 2004-03-27
回复回复我的吧!我好可怜咯!
回复
yunok 2004-03-27
rainstormmaster(暴风雨 v2.0) 兄,您贴给我的答案比较符合,不过我只是Ctrl C,Ctrl V了一下,还没有完全实现要求。我修改一下再看看。非常感谢!
回复
yunok 2004-03-27
gigilee兄,当然不是。
您没有看到我在3楼写的什么吗??

再次声明:gigilee,我要取得是第三方程序中Listview得值。不是我自己程序中的。晕死。
回复
gigilee 2004-03-27
yunok
为何晕?
不是你的要求?
回复
RonoTian 2004-03-27
借贵地一用,主要是我没有分了:
各位:
举例来说:我从数据库中读取了10人的姓名和地址,现在我希望根据他们的姓名、地址能够在Word中自动生成信封。前提我已经有了一个信封模板,就是将客户的姓名和地址替换在模板中的相应位置。并且每个信封为一页(如果有是个客户要求生成的文档有十页)。

比如格式如下:
---------------------------------------------------------------------
xx省1xx市1xx
姓名1

---------------------------------------------------------------------
xx省2xx市2xx
姓名2

---------------------------------------------------------------------

xx省3xx市3xx
姓名3

---------------------------------------------------------------------
..........
回复
yunok 2004-03-27
gigilee,我晕。
回复
gigilee 2004-03-27
思路:
把listview里面的值读出,然后保存到txt文件里面

strPath = GetPath(gMDBPath) & gOutFileName

gFileNum = FreeFile
Open strPath For Output As #gFileNum

For i = 0 To UBound(DataString) - 1
Print #gFileNum, DataString(i)
Next
回复
yunok 2004-03-27
rainstormmaster兄,我晕到。好长。晚上回家研究。

继续求征思路或代码。
回复
wzhnet 2004-03-27
up
回复
rainstormmaster 2004-03-27

http://expert.csdn.net/Expert/topic/2728/2728920.xml?temp=.9317743
我贴了一段有问题的代码,你可以看看,顺便也帮我找找哪里错了
回复
yunok 2004-03-27
我原来的思路是想取得那个应用程序的窗口类名和句柄,然后去Find他的Listview的句柄等等,然后取出需要的内容。

结果:未遂。郁闷。
回复
yunok 2004-03-27
cso(sjxsoft) 大哥,您看清楚了吗?我是要取出来别人的应用程序中的Listview的列表值。而不是我自己写的程序中有Listview。

狂晕
回复
cso 2004-03-27
加个循环体
for i = 1 to ListView1.ListItems.count
? ListView1.ListItems(i).text
next i
保存就用open语句
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7453

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告