看了你的获得其他程序里ListView和TreeView的内容的例子,可以实现.
于是我试着用下面的函数来修改其他应用程序中listview容,但不能成功:表现为如果修改任务管理器的listview,则被改的地方被置为空,不是我指定的字符串.
而如果修改的listview是有checkbox的,以下代码就执行就没有改变,甚至也不置空.'Public Const LVM_SETITEMTEXT = LVM_FIRST + 46 '模块中的常量声明,用其中任一条,都是相同的结果.
Public Const LVM_SETITEMTEXT = LVM_FIRST + 116Public 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内容,就完美了,我等菜鸟就有福了,感谢您的无私奉献,谢谢!
于是我试着用下面的函数来修改其他应用程序中listview容,但不能成功:表现为如果修改任务管理器的listview,则被改的地方被置为空,不是我指定的字符串.
而如果修改的listview是有checkbox的,以下代码就执行就没有改变,甚至也不置空.'Public Const LVM_SETITEMTEXT = LVM_FIRST + 46 '模块中的常量声明,用其中任一条,都是相同的结果.
Public Const LVM_SETITEMTEXT = LVM_FIRST + 116Public 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内容,就完美了,我等菜鸟就有福了,感谢您的无私奉献,谢谢!
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
这个过程执行到这句时,
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,以上过程就不行了.
还请大大在帮助研究下,谢谢!!