在WINDOWS中可以用GETWINDOWTEXT得到外进程的控件的字符,同时用SENDMESSAGE可以将其设为你想设的字符!可对于外进程的TListView、TTREEVIEW却无能为力,想了很多办法,终于用进程空间地址得到了TListView、TTREEVIEW各项的内容,可就是不能得到其SMALLIMAGELIST的句柄,所以总不能获取
TListView、TTREEVIEW的图标组!我试了千万遍可总不行,心中难受死了!
   大侠们如果在你有空的时候,帮我HELPH一下!

解决方案 »

  1.   

    这个我也有研究过,楼主想得到SMALLIMAGELIST的句柄很难,我在同一个程序里能取到其它控件比如:TToolBar的图标列表的句柄,取回来的句柄也可以用。但是我想即便能取到其它程序的控件的图标列表的句柄,在本程序也是不能用的。所以,最终可能唯一的解决办法就是把图标资源复制到本程序来。我也没有做出来,仅供楼主参考。
      

  2.   

    就像线程的句柄一样,我想应该得的到,无论如何,既然进程本身要使用SMALLIMAGELIST句柄,那么,其应该就存在,只是我总没搞明白,怎么就得不到它了,伤心!
      

  3.   

    用sendmessage发送LVM_GETIMAGELIST消息即可,按照你的要求其wparam应该为LVSIL_SMALL
      

  4.   

    rainstormmaster(暴风雨 v2.0) 同志:
    真的我也好想,像你想的一样!一切不就搞定啊!
    晕车。。
      

  5.   

    //真的我也好想,像你想的一样!一切不就搞定啊!什么意思,你试过了没有?怎么试的?还有你能确定目标进程中一定存在所谓的SMALLIMAGELIST吗?你能肯定listview或者treeview不是自绘的吗?
      

  6.   

    顶一下。好象跟获取WIN98中托盘里的图标列表一样困难。
      

  7.   

    我是这么用的,不行。。啦
    ImHan:=THANDLE(sendmessage(ListViewHandle,LVM_GETIMAGELIST,LVSIL_SMALL,0));
    是啊,如果是绘画的话,在98下好办,可在XP上(GIUD类型就MOVE到了内核)就。。
    但我想不会的
      

  8.   

    使用api函数enumchildwindows来找到外部程序的
    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;
      

  9.   

    baiduan(-_-小猩猩 @_@ 大金刚-_-) 
    你的方法是行不通的!
      

  10.   

    只有得到文本的,这个要靠你自己研究了:
    (*//
    标题:获取其他进程中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;
      

  11.   

    留下email我给你发一个vb的示例程序
      

  12.   

    不管怎样还是真诚感谢:xzhifei(饭桶超人(抵制日货))的回答!
    只是......
     
    rainstormmaster(暴风雨 v2.0) :
    [email protected]
    谢了!