如何利用Win32API取得另一支程式中的ListView內的所有值
2009-11-26 15:02
399 查看
uses CommCtrl; function ListViewColumnCount(mHandle: THandle): Integer; begin Result := Header_GetItemCount(ListView_GetHeader(mHandle)); end; { ListViewColumnCount } function GetListViewSelectText(mHandle: THandle;var mStrings: string): 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; I := ListView_GetNextItem(mHandle, -1, LVNI_SELECTED); if I = -1 then Exit; // 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; mStrings := ''; 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); mStrings := mStrings + #9 + vBuffer; end; finally VirtualFreeEx(vProcess, vPointer, 0, MEM_RELEASE); CloseHandle(vProcess); // mStrings.EndUpdate; end; Result := True; end; { GetListViewText } 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;
相关文章推荐
- 如何利用Win32API取得另一支程式中的ListView內的所有值(RegisterHotKey,ReadProcessMemory,WindowFromPoint和VirtualAllocEx)
- 如何利用Win32API取得另一支程式中的ListView內的所有值
- Java中如何利用File类递归的遍历指定目录中的所有文件和文件夹
- 如何取得某个菜单所绑定的所有事件处理程序
- 如何利用闭包递归打印出当前路径下所有文件
- 对象androidandroid 开发中 如何取得ListView 的 每条Item 的对象
- STL中的multimap---顺便说说如何查找同一关键字对应的所有值(利用count, lower_bound/upper_bound, equal_range)
- [iPhone程式]如何取得使用者目前的座標位置
- 如何利用反射遍历某个页面下所有的控件的值!??
- Flex中如何利用firstVisibleItem属性设置或取得第一个显示节点的例子
- 如何取得所有的Session变量
- 如何利用Java遍历所有的指定文件目录下的所有文件
- SQL Server中如何取得所有的表的表名的列表(摘)
- 如何利用java的反射机制动态的取得对象的属性?
- 如何取得aspx页面上所有控件的名称和值?
- 如何取得所有的Session变量?
- 如何取得一个表的所有字段名用逗号分割
- 如何用PHP取得所有HTTP请求头
- 如何利用已有的cook模拟登陆知乎,并爬取相关问题下所有的答案
- Visual C# 2005 - 如何取得某目录之下所有文件名称的字符串集合