获取其他进程中ListView的文本
2006-02-04 13:45:30 来源:WEB开发网核心提示:(*//标题:获取其他进程中ListView的文本说明:Window2000+Delphi6调试通过设计:Zswang支持:wjhu111@21cn.com日期:2004-03-25//*)uses CommCtrl;function ListViewColumnCount(mHandle: THandle): Int
(*// 标题:获取其他进程中ListView的文本 说明:Window2000+Delphi6调试通过 设计:Zswang 支持:wjhu111@21cn.com 日期: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;
更多精彩
赞助商链接