我想,HIMAGELIST句柄应该是一个进程相关的结构地址吧,如你所言,如果知道其数据结构,用<br>ReadProcessMemory应该可以读出来的吧,可惜ImageList控件不是窗口, 否则可以在其进程<br>分配一块空间,然后发个消息就好了,比如这个读取TreeView控件的小函数:<br><br> // 扩展的TreeView_GetItem (取得TreeView指定子项目)<br>function TreeView_GetItem_Ex(hwndTV: HWND; var TVItem: TTVItem): Bool;<br>var<br> ProcessID, ProcessHD, Temp: DWORD;<br> pszText, MemPoint: Pointer;<br>begin<br> Result := FALSE;<br><br> GetWindowThreadProcessId(hwndTV, ProcessID);<br><br> ProcessHD := OpenProcess(<br> PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, ProcessID);<br> if (ProcessHD = 0) then Exit;<br><br> MemPoint := VirtualAllocEx(ProcessHD, nil,<br> SizeOf(TTVItem) + TVItem.cchTextMax + 1,<br> MEM_COMMIT, PAGE_READWRITE);<br> if (MemPoint = nil) then Exit;<br><br> pszText := TVItem.pszText; // 保存本进程地址<br> PChar(pszText)^ := #0;<br> TVItem.pszText := PChar(Integer(MemPoint) + SizeOf(TTVItem));<br> if (WriteProcessMemory(ProcessHD, MemPoint, @TVItem, SizeOf(TVItem), Temp) = FALSE) then Exit;<br> if (WriteProcessMemory(ProcessHD, TVItem.pszText, pszText, 1, Temp) = FALSE) then Exit;<br><br> Result := (SendMessage(hwndTV, TVM_GETITEM, 0, LongInt(MemPoint)) <> 0);<br><br> if (ReadProcessMemory(ProcessHD, TVItem.pszText, pszText, TVItem.cchTextMax + 1, Temp) = FALSE) then<br> begin<br> Result := FALSE;<br> Exit;<br> end;<br> TVItem.pszText := pszText; // 恢复本进程地址<br><br> VirtualFreeEx(ProcessHD, MemPoint, SizeOf(TTVItem) + TVItem.cchTextMax + 1, MEM_DECOMMIT);<br> VirtualFreeEx(ProcessHD, MemPoint, 0, MEM_RELEASE);<br>end;<br><br> // 取指定TreeView子项目文字<br>function TreeView_GetItem_Text(hwndTV: HWND; hitem: HTreeItem): string;<br>var<br> Buffer: array[0..50] of Char;<br> TVItem: TTVItem;<br>begin<br> TVItem.hItem := hitem;<br> TVItem.mask := TVIF_TEXT;<br> TVItem.pszText := @Buffer[0];<br> TVItem.cchTextMax := 50;<br><br> if TreeView_GetItem_Ex(hwndTV, TVItem) then<br> Result := Buffer<br> else<br> Result := '';<br>end;<br><br>但是这个函数有一个小问题,就是Window 9x不支持远程内存分配,解决方法呢,<br>可以用消息钩子,将我们的DLL注入目标进程, 随后DLL中的代码直接操作即可, <br>我想ImageList也可以用这样的方法搞定(DLL中直接调用ImageList_GetIcon)