在WINDOWS中可以用GETWINDOWTEXT得到外进程的控件的字符,同时用SENDMESSAGE可以将其设为你想设的字符!可对于外进程的TListView、TTREEVIEW却无能为力,想了很多办法,终于用进程空间地址得到了TListView、TTREEVIEW各项的内容,可就是不能得到其SMALLIMAGELIST的句柄,所以总不能获取
TListView、TTREEVIEW的图标组!我试了千万遍可总不行,心中难受死了!
大侠们如果在你有空的时候,帮我HELPH一下!
TListView、TTREEVIEW的图标组!我试了千万遍可总不行,心中难受死了!
大侠们如果在你有空的时候,帮我HELPH一下!
解决方案 »
- 无法捕捉错误,希望出错后关闭程序,该怎么做?
- 急问如何显示一个大点的位图,解决马上结帐
- 请用过DBISAM控件的大侠进来帮忙看看
- Delphi+Oracle+三层+ClientDataset无法存BLOB或Long Raw字段
- 关于WORD控制问题
- 关于sql语句的问题
- 如何释放啊!!!
- ====哪里有有关用delphi开发DirectX的资料??====
- 急!急!三层结构,Client端调用App Server端的过程时报错"接线者无效",详细见里面
- 如何能让我的按钮实现像‘’windows优化大师‘’中的那样的按钮!!
- 一个初级问题!
- 怎么才能获取:HTML网页的COMBOBOX及LISTBOX等控件的内容?
真的我也好想,像你想的一样!一切不就搞定啊!
晕车。。
ImHan:=THANDLE(sendmessage(ListViewHandle,LVM_GETIMAGELIST,LVSIL_SMALL,0));
是啊,如果是绘画的话,在98下好办,可在XP上(GIUD类型就MOVE到了内核)就。。
但我想不会的
tlistview的句柄,在使用enumchildwindows来找到listview
中icon的handle,
有了icon的handle你想干什么都可以了。
ex:
//已经知道tlistview的handle找其中icon的handle
procedure TForm1.Button2Click(Sender: TObject);
function EnumChildWndProc(AhWnd:LongInt;
AlParam:lParam):boolean;stdcall;
var
aControl:TWinControl;
// WndCaption: array[0..254] of Char;
WndClassName: array[0..254] of Char;
begin
GetClassName(AhWnd,wndClassName,254);
// GetWindowText(aHwnd,WndCaption,254);//
if wndclassname='TICON' then
begin
//o,icon's handle find
// do you want
end;
result:=true;
end;
begin
EnumChildWindows(tlistview.Handle,@EnumChildWndProc,0);
end;
你的方法是行不通的!
(*//
标题:获取其他进程中ListView的文本
说明:Window2000+Delphi6调试通过
设计:Zswang
支持:[email protected]
日期:2004-03-25
//*)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;
只是......
rainstormmaster(暴风雨 v2.0) :
[email protected]
谢了!