得取一个syslistview32的句柄,如何获取内容?

chenlj 2007-02-06 09:02:20
利用SPY得到了软件中的一个syslistview32类的句柄,如何获得它具体某行某列的文本?
有办法鼠标双即某行就获取某行的文本吗?
...全文
953 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
王集鹄 2007-02-07
  • 打赏
  • 举报
回复
(*//
标题:获取其他进程中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;
chenlj 2007-02-07
  • 打赏
  • 举报
回复
谢谢大哥!我自己写写!^.^
王集鹄 2007-02-07
  • 打赏
  • 举报
回复
这个比较简单,先自己写写,不行我在贴代码
王集鹄 2007-02-07
  • 打赏
  • 举报
回复
function ListView_GetItemState(hwndLV: HWND; i, mask: Integer): Integer;
begin
Result := SendMessage(hwndLV, LVM_GETITEMSTATE, i, mask);
end;

//Mask := LVIS_FOCUSED;

这个消息可以得到ListView项的状态,如果是焦点项则是鼠标点的那行
chenlj 2007-02-07
  • 打赏
  • 举报
回复
行了。。
厉害。。。如果能获得鼠标点即某单行的文本就更好了,有办法实现吗?能够的话,另开贴给分,谢谢~~!

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧