|
上面那个只能获取Delphi开发的程序的
刘麻子大虾的,试试
uses CommCtrl;
function ListView_GetItemText_Ex(hwndLV: HWND; i, iSubItem: Integer; pszText: PChar; cchTextMax: Integer): Integer; var LVItem: TLVItem; ProcessID, ProcessHD, Temp: DWORD; MemPoint: Pointer; begin GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID);
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem) + cchTextMax, MEM_COMMIT, PAGE_READWRITE);
LVItem.iSubItem := iSubItem; LVItem.cchTextMax := cchTextMax; LVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TLVItem)); WriteProcessMemory(ProcessHD, MemPoint, @LVItem, SizeOf(TLVItem), Temp); Result := SendMessage(hwndLV, LVM_GETITEMTEXT, i, Integer(MemPoint));
ReadProcessMemory(ProcessHD, Pointer(Integer(MemPoint) + SizeOf(TLVItem)), pszText, cchTextMax, Temp);
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem) + cchTextMax, MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE); end;
procedure TForm1.Button1Click(Sender: TObject); var TextBuffer: array[0..100] of Char; begin ListView_GetItemText_Ex($01590346, 0, 0, TextBuffer, 100); ShowMessage(TextBuffer); end; 至于定位,用LVM_SETITEMSTATE消息同理应用即可
|
|
to 大家: 定位到某一行问题,我已解决了.代码如下,但如何能发鼠标右键消息过去那一行?或获得那一行坐标值?
uses CommCtrl; {$R *.dfm}
function ListView_GetItemText_Ex(hwndLV: HWND; i, iSubItem: Integer; pszText: PChar; cchTextMax: Integer): Integer; var LVItem: TLVItem; ProcessID, ProcessHD, Temp: DWORD; MemPoint: Pointer; begin GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID);
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem) + cchTextMax, MEM_COMMIT, PAGE_READWRITE);
lvitem.state:=LVIS_SELECTED; lvitem.stateMask:=LVIS_SELECTED; WriteProcessMemory(ProcessHD, MemPoint,@LVItem,SizeOf(TLVItem), Temp); SendMessage(hwndLV, LVM_SETITEMSTATE,i, Integer(MemPoint));
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem) + cchTextMax, MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE);
end;
procedure TForm1.Button1Click(Sender: TObject); var TextBuffer: array[0..100] of Char; begin ListView_GetItemText_Ex(984608,10, 0, TextBuffer, 100);
end;
|
|
先贴一些代码片断,仅供参考:
// 扩展的ListView项目选取函数 function ListView_SetItemState_Ex(hwndLV: HWND; i: Integer; data, mask: UINT): Bool; var LVItem: TLVItem; ProcessID, ProcessHD, Temp: DWORD; MemPoint: Pointer; begin GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID);
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem), MEM_COMMIT, PAGE_READWRITE);
LVItem.stateMask := mask; LVItem.state := data; WriteProcessMemory(ProcessHD, MemPoint, @LVItem, SizeOf(TLVItem), Temp);
Result := (SendMessage(hwndLV, LVM_SETITEMSTATE, i, Integer(MemPoint)) <> 0);
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem), MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE); end;
// 扩展的ListView项目读取函数 function ListView_GetItemText_Ex(hwndLV: HWND; i, iSubItem: Integer; pszText: PChar; cchTextMax: Integer): Integer; var LVItem: TLVItem; ProcessID, ProcessHD, Temp: DWORD; MemPoint: Pointer; begin GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID);
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TLVItem) + cchTextMax, MEM_COMMIT, PAGE_READWRITE);
LVItem.iSubItem := iSubItem; LVItem.cchTextMax := cchTextMax; LVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TLVItem));
WriteProcessMemory(ProcessHD, MemPoint, @LVItem, SizeOf(TLVItem), Temp); Result := SendMessage(hwndLV, LVM_GETITEMTEXT, i, Integer(MemPoint));
ReadProcessMemory(ProcessHD, Pointer(Integer(MemPoint) + SizeOf(TLVItem)), pszText, cchTextMax, Temp);
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVItem) + cchTextMax, MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE); end;
// 扩展的TreeView_GetItem (取得TreeView指定子项目) function TreeView_GetItem_Ex(hwndTV: HWND; var TVItem: TTVItem): Bool; var ProcessID, ProcessHD, Temp: DWORD; pszText, MemPoint: Pointer; begin Result := FALSE;
GetWindowThreadProcessId(hwndTV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID); if (ProcessHD = 0) then Exit;
MemPoint := VirtualAllocEx(ProcessHD, nil, SizeOf(TTVItem) + TVItem.cchTextMax + 1, MEM_COMMIT, PAGE_READWRITE); if (MemPoint = nil) then Exit;
pszText := TVItem.pszText; // 保存本进程地址 PChar(pszText)^ := #0; TVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TTVItem)); if (WriteProcessMemory(ProcessHD, MemPoint, @TVItem, SizeOf(TVItem), Temp) = FALSE) then Exit; if (WriteProcessMemory(ProcessHD, TVItem.pszText, pszText, 1, Temp) = FALSE) then Exit;
Result := (SendMessage(hwndTV, TVM_GETITEM, 0, LongInt(MemPoint)) <> 0);
if (ReadProcessMemory(ProcessHD, TVItem.pszText, pszText, TVItem.cchTextMax + 1, Temp) = FALSE) then begin Result := FALSE; Exit; end; TVItem.pszText := pszText; // 恢复本进程地址
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TTVItem) + TVItem.cchTextMax + 1, MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE); end;
// 取指定TreeView子项目文字 function TreeView_GetItem_Text(hwndTV: HWND; hitem: HTreeItem): string; var Buffer: array[0..50] of Char; TVItem: TTVItem; begin TVItem.hItem := hitem; TVItem.mask := TVIF_TEXT; TVItem.pszText := @Buffer[0]; TVItem.cchTextMax := 50;
if TreeView_GetItem_Ex(hwndTV, TVItem) then Result := Buffer else Result := ''; end;
// 扩展的ListView_FindItem function ListView_FindItem_Ex(hwndLV: HWND; iStart: Integer; var LVFindInfo: TLVFindInfo): Integer; var ProcessID, ProcessHD, Temp: DWORD; psz, MemPoint: Pointer; begin Result := -1; // 默认查找失败
GetWindowThreadProcessId(hwndLV, ProcessID);
ProcessHD := OpenProcess( PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID); if (ProcessHD = 0) then Exit;
MemPoint := VirtualAllocEx( ProcessHD, nil, SizeOf(TLVFindInfo) + StrLen(LVFindInfo.psz) + 1, MEM_COMMIT, PAGE_READWRITE); if (MemPoint = nil) then Exit;
psz := LVFindInfo.psz; // 保存本进程地址 LVFindInfo.psz := PChar(Integer(MemPoint) + SizeOf(TLVFindInfo)); if (WriteProcessMemory(ProcessHD, MemPoint, @LVFindInfo, SizeOf(TLVFindInfo), Temp) = FALSE) then Exit; if (WriteProcessMemory(ProcessHD, LVFindInfo.psz, psz, StrLen(psz) + 1, Temp) = FALSE) then Exit;
Result := SendMessage(hWndLv, LVM_FINDITEM, iStart, LongInt(MemPoint));
LVFindInfo.psz := psz; // 恢复本进程地址
VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TLVFindInfo) + StrLen(psz) + 1, MEM_DECOMMIT); VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE); end;
|