看了你的获得其他程序里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内容,就完美了,我等菜鸟就有福了,感谢您的无私奉献,谢谢!

解决方案 »

  1.   


    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
      

  2.   

    首先感谢绿豆大侠的帮助,谢谢
    这个过程执行到这句时,
    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,以上过程就不行了.
    还请大大在帮助研究下,谢谢!!
      

  3.   

    豆子的WriteProcessMemory声明里的指针一定都是BYVAL AS LONG的,哈哈.
      

  4.   

    这是我的声明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的貌似可以吧,至少我这里试过了可以