关于用VB修改或增加(多行)其他应用程序中listview内容?

crbbwwweee 2008-03-26 10:44:21
看了你的获得其他程序里ListView和TreeView的内容的例子,可以实现.
于是我试着用下面的函数来修改其他应用程序中listview容,但不能成功:

表现为如果修改任务管理器的listview,则被改的地方被置为空,不是我指定的字符串.
而如果修改的listview是有checkbox的,以下代码就执行就没有改变,甚至也不置空.

'Public Const LVM_SETITEMTEXT = LVM_FIRST + 46 '模块中的常量声明,用其中任一条,都是相同的结果.
Public Const LVM_SETITEMTEXT = LVM_FIRST + 116

Public Type LVITEM
mask As Long
iItem As Long
iSubItem As Long
state As Long
stateMask As Long
pszText As String
cchTextMax As Long
iImage As Long
lParam As Long
iIndent As Long
End Type

'API声明略

Public Function SetText(hwnd As Long, I As Long, iSubItem As Long, pszText As String)
'hWnd是listview句柄,I是行,iSubItem是列
Dim pitem As LV_ITEM
Dim dwProcessId As Long
Dim hProcess As Long
Dim lpListItemRemote As Long
Dim MyListItemRemote As Long
Dim A() As Byte

pszText = pszText & Chr(0)

A = StrConv(pszText, vbFromUnicode)

Call GetWindowThreadProcessId(hwnd, dwProcessId) '获取进程ID
hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, dwProcessId)
'打开指定的进程
If hProcess <> 0 Then
'***********************************************************
'打开指定的进程,并分配内存空间
'VirtualAllocEx(目标进程的句柄,0,内存区域的大小,分配类型,新分配内存的存取保护类型)返回所分配页面的基址
'***********************************************************
lpListItemRemote = VirtualAllocEx(hProcess, 0, Len(pitem), MEM_COMMIT, PAGE_READWRITE) '放一个结构变量的地址
MyListItemRemote = VirtualAllocEx(hProcess, 0, Len(pszText), MEM_COMMIT, PAGE_READWRITE) '放字符串的地址

With pitem
.iSubItem = iSubItem ' 列数(在第几列)
.pszText = MyListItemRemote '放字符串的地址
End With

Call WriteProcessMemory(hProcess, MyListItemRemote, pszText, Len(pszText), 0) '写入字符串
Call WriteProcessMemory(hProcess, lpListItemRemote, pitem, Len(pitem), 0) '写入结构

Call SendMessage(hwnd, LVM_SETITEMTEXT, I, ByVal lpListItemRemote)

Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, 0, MEM_DECOMMIT)
Call VirtualFreeEx(hProcess, ByVal MyListItemRemote, 0, MEM_DECOMMIT)
End If

CloseHandle hProcess

End Function


请绿豆大侠帮助指点下,或者你将你的示例在完善些,加入用VB修改或增加(多行)其他应用程序中listview内容,就完美了,我等菜鸟就有福了,感谢您的无私奉献,谢谢!
...全文
179 6 打赏 收藏 举报
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
supergreenbean 2008-03-27
  • 打赏
  • 举报
回复

Sub SetLVText(ByVal sText As String, Optional ByVal lItemIndex As Long = 0, Optional lSubItemIndex As Long = 0)
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 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, ByVal String(nMaxLen, Chr(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)

sText = Left$(sText, nMaxLen)
bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpTextRemote, ByVal sText, Len(sText), dwBytesWrite)

i = SendMessage(mhwnd, LVM_SETITEMTEXT, lItemIndex, ByVal lpListItemRemote)

Call VirtualFreeEx(hProcess, ByVal lpListItemRemote, 0, MEM_DECOMMIT)
Call VirtualFreeEx(hProcess, ByVal lpTextRemote, 0, MEM_DECOMMIT)
End If
CloseHandle hProcess
End Sub
Sandrer 2008-03-27
  • 打赏
  • 举报
回复
加个循环不就得了~
crbbwwweee 2008-03-27
  • 打赏
  • 举报
回复
我将声明替成你的,仍旧是这个错误,

可否将你的实例发给到我的邮箱
ymhu2002@163.com

非常感谢您的帮助,谢谢!
supergreenbean 2008-03-27
  • 打赏
  • 举报
回复
这是我的声明

Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long

首行有checkbox的貌似可以吧,至少我这里试过了可以

嗷嗷叫的老马 2008-03-27
  • 打赏
  • 举报
回复
豆子的WriteProcessMemory声明里的指针一定都是BYVAL AS LONG的,哈哈.
crbbwwweee 2008-03-27
  • 打赏
  • 举报
回复
首先感谢绿豆大侠的帮助,谢谢
这个过程执行到这句时,
bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpTextRemote, ByVal String(nMaxLen, Chr(0)), nMaxLen + 1, dwBytesWrite)

系统提示:
实时错误 '49'
DLL调用约定错误

如果改成
bWriteOK = WriteProcessMemory(ByVal hProcess, ByVal lpTextRemote, Str(nMaxLen) & Chr(0), nMaxLen + 1, dwBytesWrite)

可对任务管理修改成功,但是对于行首有Checkbox的listview,以上过程就不行了.
还请大大在帮助研究下,谢谢!!
发帖
API

1483

社区成员

VB API
社区管理员
  • API
加入社区
帖子事件
创建了帖子
2008-03-26 10:44
社区公告
暂无公告