98下如何取其它软件的ListView控件内容! ( 积分: 200 )

  • 主题发起人 主题发起人 xuhao1
  • 开始时间 开始时间
X

xuhao1

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,解决了立即给分。<br>ListView 的句柄已经获得。
 
如题,解决了立即给分。<br>ListView 的句柄已经获得。
 
//參考以下函數,因沒有98,沒有試過98是否可以,2000下面測試通過<br>//取得的字符在text保存<br>//ptPosition保存位置<br>procedure GetDesktopIconItem(var Text: string; var ptPosition: TPoint;<br> &nbsp;Index: Integer);<br>var<br> &nbsp;DesktopWnd: HWND;<br> &nbsp;ItemText: array[0..MaxTextLen] of char;<br> &nbsp;Item: TLvItem;<br><br> &nbsp;dwProcessID: DWORD;<br> &nbsp;hProcess: THandle;<br> &nbsp;lpTextRemote: Pointer;<br> &nbsp;lpPositionRemote: Pointer;<br> &nbsp;lpListItemRemote: Pointer;<br><br> &nbsp;lpData: Pointer;<br><br> &nbsp;dwBytesRead, dwBytesWrite: DWORD;<br>begin<br> &nbsp;Text := '';<br> &nbsp;ptPosition.X := 0;<br> &nbsp;ptPosition.Y := 0;<br><br> &nbsp;DesktopWnd := GetDesktop; // 桌面的句柄,改成你要的<br><br> &nbsp;GetWindowThreadProcessId(DesktopWnd, dwProcessID);<br> &nbsp;hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, dwProcessID);<br> &nbsp;if hProcess = 0 then //得不到指定進程的句柄<br> &nbsp; &nbsp;Exit;<br><br> &nbsp;try<br> &nbsp; &nbsp;lpData := VirtualAllocEx(hProcess, nil,<br> &nbsp; &nbsp; &nbsp;MaxTextLen + 1 + SizeOf(TPoint) + SizeOf(TLvItem), // 長度<br> &nbsp; &nbsp; &nbsp;MEM_COMMIT, PAGE_READWRITE);<br><br> &nbsp; &nbsp;if not Assigned(lpData) then<br> &nbsp; &nbsp; &nbsp;Exit;<br><br> &nbsp; &nbsp;lpTextRemote := lpData;<br> &nbsp; &nbsp;lpPositionRemote := PChar(lpData) + MaxTextLen + 1;<br> &nbsp; &nbsp;lpListItemRemote := PChar(lpData) + MaxTextLen + 1 + SizeOf(TPoint);<br><br> &nbsp; &nbsp;try<br> &nbsp; &nbsp; &nbsp;ZeroMemory(@ItemText, MaxTextLen + 1);<br> &nbsp; &nbsp; &nbsp;WriteProcessMemory(hProcess, lpTextRemote, @ItemText,<br> &nbsp; &nbsp; &nbsp; &nbsp;MaxTextLen + 1, dwBytesWrite);<br> &nbsp; &nbsp; &nbsp;WriteProcessMemory(hProcess, lpPositionRemote, @ptPosition,<br> &nbsp; &nbsp; &nbsp; &nbsp;SizeOf(TPoint), dwBytesWrite);<br><br> &nbsp; &nbsp; &nbsp;ZeroMemory(@Item, SizeOf(TLvItem));<br> &nbsp; &nbsp; &nbsp;Item.mask := LVIF_TEXT;<br> &nbsp; &nbsp; &nbsp;Item.iItem := Index;<br> &nbsp; &nbsp; &nbsp;Item.iSubItem := 0;<br> &nbsp; &nbsp; &nbsp;Item.pszText := lpTextRemote;<br> &nbsp; &nbsp; &nbsp;Item.cchTextMax := MaxTextLen;<br> &nbsp; &nbsp; &nbsp;dwBytesWrite := 0;<br><br> &nbsp; &nbsp; &nbsp;if not WriteProcessMemory(hProcess, lpListItemRemote, @Item,<br> &nbsp; &nbsp; &nbsp; &nbsp;sizeof(TLvItem),<br> &nbsp; &nbsp; &nbsp; &nbsp;dwBytesWrite) then<br> &nbsp; &nbsp; &nbsp; &nbsp;Exit;<br><br> &nbsp; &nbsp; &nbsp;SendMessage(DesktopWnd, LVM_GETITEMTEXT, Index,<br> &nbsp; &nbsp; &nbsp; &nbsp;LPARAM(lpListItemRemote));<br> &nbsp; &nbsp; &nbsp;SendMessage(DesktopWnd, LVM_GETITEMPOSITION, Index,<br> &nbsp; &nbsp; &nbsp; &nbsp;LPARAM(lpPositionRemote));<br> &nbsp; &nbsp; &nbsp;ReadProcessMemory(hProcess, lpTextRemote, @ItemText, MaxTextLen + 1,<br> &nbsp; &nbsp; &nbsp; &nbsp;dwBytesRead);<br> &nbsp; &nbsp; &nbsp;ReadProcessMemory(hProcess, lpPositionRemote, @ptPosition,<br> &nbsp; &nbsp; &nbsp; &nbsp;SizeOf(TPoint), dwBytesRead);<br><br> &nbsp; &nbsp; &nbsp;Text := ItemText;<br> &nbsp; &nbsp;finally<br> &nbsp; &nbsp; &nbsp;VirtualFreeEx(hProcess, lpData, 0, MEM_RELEASE);<br> &nbsp; &nbsp;end;<br> &nbsp;finally<br> &nbsp; &nbsp;CloseHandle(hProcess);<br> &nbsp;end;<br>end;<br><br>//應用例子<br>function GetDesktopIconCount: Integer;<br>begin<br> &nbsp;Result := ListView_GetItemCount(GetDesktop);<br>end;<br><br>procedure SaveDesktopIconPos(FileName: string);<br>var<br> &nbsp;i: Integer;<br> &nbsp;IconCount: Integer;<br> &nbsp;Text: string;<br> &nbsp;ptPosition: TPoint;<br> &nbsp;Ini: TIniFile;<br>begin<br> &nbsp;IconCount := GetDesktopIconCount;<br><br> &nbsp;if FileExists(FileName) then<br> &nbsp; &nbsp;DeleteFile(FileName);<br><br> &nbsp;Ini := TIniFile.Create(FileName);<br><br> &nbsp;try<br> &nbsp; &nbsp;for i := 0 to IconCount - 1 do<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;GetDesktopIconItem(Text, ptPosition, i);<br> &nbsp; &nbsp; &nbsp;Ini.WriteString('Item' + IntToStr(i), 'Text', Text);<br> &nbsp; &nbsp; &nbsp;Ini.WriteInteger('Item' + IntToStr(i), 'X', ptPosition.X);<br> &nbsp; &nbsp; &nbsp;Ini.WriteInteger('Item' + IntToStr(i), 'Y', ptPosition.Y);<br> &nbsp; &nbsp;end;<br> &nbsp;finally<br> &nbsp; &nbsp;Ini.Free;<br> &nbsp;end;<br>end;<br>
 
感谢楼上的兄弟,这个方法98下不行
 
参考:http://www.delphibbs.com/keylife/iblog_show.asp?xid=12219<br>原理相同的
 
你有EMAIL吗,我这有一个源码,不知你有没有,你可以拿去试试看看的<br>readme.txt文件如下<br>PrcMemMgrTest<br><br>Unter bestimmten Bedingungen ist es notwendig, mit einem Delphi-Prozess direkt<br>auf den Adressraum eines fremden Prozesses zuzugreifen. Ein Beispiel ist der<br>Aufruf von Messages aus Commctrl.pas (TabCtrl, ListView, TreeView...) f黵<br>Fenster eines fremden Prozesses (z.B. Explorer), wenn in der Message Pointer<br>黚ergeben werden.<br><br>Die hierbei zu beachtenden Unterschiede zwischen NT und 9x habe ich versucht in<br>der Klasse TProcessMemMgr einigerma遝n objektorientiert unterzubringen. Die<br>Klasse kapselt Speicheranforderung und Freigabe im fremden Prozess sowie Lese-<br>und Schreibzugriffe darauf.<br><br>Das Anwendungsbeispiel holt den Inhalt eines fremden (oder nat黵lich auch<br>eigenen) Listview in das eigene Fenster. Einfach mit der Maus auf ein Listview<br>(rechte Explorer-Seite, Desktop, etc.) zegen und F12 dr點ken. Zur Kontrolle wird<br>in der Titelzeile der Klassennname angezeigt, SysListView32 und TListView werden<br>als g黮tig akzeptiert.<br><br>Getestet ist das Verfahren f黵 NT4SP5 und W98SE. Mich interessieren eure<br>Testergebnisse f黵 die anderen Systeme sowie nat黵lich alle weiteren<br>Informationen in diesem Zusammenhang.<br><br>Danke f黵 die M黨e.<br><br>-Michael
 
楼上的兄弟,发送到 xh1000@hotmail.com ,试试,能用就给分
 
发给你了,你看看
 
你的信箱不好使呀,被退回来了
 
unit Unit2;<br><br>interface<br>uses windows,ComCtrls,Commctrl;<br><br>function GetOtherListViewItems(hWnd:hWnd;Index:integer):TListItem;<br>implementation<br><br>function GetOtherListViewItems(hWnd:hWnd;Index:integer):TListItem;<br>var<br> &nbsp;Item: TLVItem;<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;with Item do<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;mask := LVIF_PARAM;<br> &nbsp; &nbsp; &nbsp; &nbsp;iItem := Index;<br> &nbsp; &nbsp; &nbsp; &nbsp;iSubItem := 0;<br> &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; &nbsp;if Bool( SendMessage(hWnd, LVM_GETITEM, 0, Longint(@Item)) )<br> &nbsp; &nbsp; &nbsp; &nbsp; then Result := TListItem(Item.lParam)<br> &nbsp; &nbsp; &nbsp; &nbsp; else Result := nil;<br> &nbsp; &nbsp;end;<br>end.<br>[red] 在你的程序里包含本单元。<br>hWnd:被取值窗口<br>Index:被索引<br>功能:用于取得其他程序中LISTVIEW中的项目。[/red]
 
请发送到 help@haodi.008.net
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
866
DelphiTeacher的专栏
D
后退
顶部