列表小偷
本帖最后由 jim19 于 2023-7-16 10:09 编辑自己开发的一个软件, 很多列表很长, 不注册也无法保存, 用ocr很费劲, 所以开发了这么个小软件, 原理就是通过sendmessage LVM_GETITEM获取列表数据, 使用也很简单, 对着有列表的控件, 然后按快捷键win+f2就可以了.
譬如下面这种类型的采集软件
软件对所有列表都生效, 下面用windows文件夹仅作演示.
核心代码delphi:
function GetListViewText(mHandle: THandle; mStrings: TStrings): Boolean;
var
vColumnCount: Integer;
vItemCount: Integer;
I, J: Integer;
vBuffer: array 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, 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;
感谢分享,W11下载不可用,能打开软件,点击文件、热键、功能均提示错误:Access violation at address0046E232 in module'列表小偷。exe'.Read of
address 000000B4. 知心 发表于 2023-7-16 09:49
dir >list.txt 可以实现类似的功能
额, 貌似我录像用错了例子... 手上没有现成的那种采集软件 ,信息要收费才保存的例子. 很牛 等一个蓝奏 适合批量复制文件名 dir >list.txt 可以实现类似的功能 先收藏,备用,感谢分享! 感谢分享 先收藏了感谢分享 挺厉害,这都想得到可以获取列表,长知识了顺便收藏或许以后能用 感谢楼主分享,这是很用心的工具。 试试看网页上的列表能不能偷出来{:1_918:}