麻烦dephi的朋友帮我将下面的代码做成dll,然后发送我的信箱:[email protected]
第一个发的朋友将获得50分,其他的前五位朋友每人将获得10分。谢谢
因为我用的是VB,所以请详细注明调用方法http://dev.csdn.net/develop/article/26/26046.shtm
获取其他进程中ListView的文本     zswangII [原作]  
关键字   ListView Delphi OpenProcess WriteProcessMemory ReadProcessMemory LVM_GETITEM 
出处    
 
 (*//
标题:获取其他进程中ListView的文本
说明:Window2000+Delphi6调试通过
设计:Zswang
支持:[email protected]
日期:2004-03-25
//*)uses CommCtrl;function ListViewColumnCount(mHandle: THandle): Integer;
begin
  Result := Header_GetItemCount(ListView_GetHeader(mHandle));
end; { ListViewColumnCount }function GetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;
var
  vColumnCount: Integer;
  vItemCount: Integer;
  I, J: Integer;
  vBuffer: array[0..255] of Char;
  vProcessId: DWORD;
  vProcess: THandle;
  vPointer: Pointer;
  vNumberOfBytesRead: Cardinal;
  S: string;
  vItem: TLVItem;
begin
  Result := False;
  if not Assigned(mStrings) then Exit;
  vColumnCount := ListViewColumnCount(mHandle);
  if vColumnCount <= 0 then Exit;
  vItemCount := ListView_GetItemCount(mHandle);
  GetWindowThreadProcessId(mHandle, @vProcessId);
  vProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or
    PROCESS_VM_WRITE, False, vProcessId);
  vPointer := VirtualAllocEx(vProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT,
    PAGE_READWRITE);
  mStrings.BeginUpdate;
  try
    mStrings.Clear;
    for I := 0 to vItemCount - 1 do begin
      S := '';
      for J := 0 to vColumnCount - 1 do begin
        with vItem do begin
          mask := LVIF_TEXT;
          iItem := I;
          iSubItem := J;
          cchTextMax := SizeOf(vBuffer);
          pszText := Pointer(Cardinal(vPointer) + SizeOf(TLVItem));
        end;
        WriteProcessMemory(vProcess, vPointer, @vItem,
          SizeOf(TLVItem), vNumberOfBytesRead);
        SendMessage(mHandle, LVM_GETITEM, I, lparam(vPointer));
        ReadProcessMemory(vProcess, Pointer(Cardinal(vPointer) + SizeOf(TLVItem)),
          @vBuffer[0], SizeOf(vBuffer), vNumberOfBytesRead);
        S := S + #9 + vBuffer;
      end;
      Delete(S, 1, 1);
      mStrings.Add(S);
    end;
  finally
    VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE);
    CloseHandle(vProcess);
    mStrings.EndUpdate;
  end;
  Result := True;
end; { GetListViewText }//Example
procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle, 1, MOD_WIN, VK_F2);
end;procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnRegisterHotKey(Handle, 1);
end;procedure TForm1.WMHOTKEY(var Msg: TWMHOTKEY);
begin
  case Msg.HotKey of
    1:
      GetListViewText(
        WindowFromPoint(Point(Mouse.CursorPos.X, Mouse.CursorPos.Y)),
        MemoText.Lines);
  end;
end;

解决方案 »

  1.   

    还不如自己改改,写成VB的函数~~里面用的大多是标准API,所以很好改的~~
      

  2.   

    感谢各位朋友的支持。现在我共收到两个dll,一个输出函数是GetListViewText,一个是GetListViewBuffer。前面一个没有说明,后面一个有。前面一个我是这样声明的:
    Private Declare Function GetListViewText Lib "GetListView" (ByVal mHandle As Long, ByVal mBuffer As String) As Long但是执行的时候总出错,不知什么原因,希望发这个dll的朋友帮解释一下。后面一个是:
    Private Declare Function GetListViewBuffer Lib "GetListViewLib" (ByVal mHandle As Long, ByVal mBuffer As String, ByVal mSize As Long) As Long在执行的时候如果发现如果定义的变量太大(超过12000字节),就会出错,不知什么原因。